1、Process模块介绍

process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建。

Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,表示一个子进程中的任务(尚未启动)

强调:
1. 需要使用关键字的方式来指定参数
2. args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号 参数介绍:
1 group参数未使用,值始终为None
2 target表示调用对象,即子进程要执行的任务
3 args表示调用对象的位置参数元组,args=(1,2,'egon',)
4 kwargs表示调用对象的字典,kwargs={'name':'egon','age':18}
5 name为子进程的名称
p.start():启动进程,并调用该子进程中的p.run()
p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法
p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁
p.is_alive():如果p仍然运行,返回True
p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程 方法介绍

方法介绍

p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置
p.name:进程的名称
p.pid:进程的pid
p.exitcode:进程在运行时为None、如果为–N,表示被信号N结束(了解即可)
p.authkey:进程的身份验证键,默认是由os.urandom()随机生成的32字符的字符串。这个键的用途是为涉及网络连接的底层进程间通信提供安全性,这类连接只有在具有相同的身份验证键时才能成功(了解即可) 属性介绍

属性介绍

在Windows操作系统中由于没有fork(linux操作系统中创建进程的机制),在创建子进程的时候会自动 import 启动它的这个文件,而在 import 的时候又执行了整个文件。因此如果将process()直接写在文件中就会无限递归创建子进程报错。所以必须把创建子进程的部分使用if __name__ ==‘__main__’ 判断保护起来,import 的时候  ,就不会递归运行了。

在windows中使用process模块的注意事项

2、使用Process模块创建进程

在python中开启一个子进程

import os
import time
from multiprocessing import Process
def func():
time.sleep(2)
print(os.getpid(),os.getppid())
if __name__ == "__main__":
Process(target=func).start()

多个进程同时运行(注意,子进程的执行顺序不是根据启动顺序决定的)

import time
import random
from multiprocessing import Process
def send_mail(name):
time.sleep(random.uniform(1,3))
print('已经给%s发送邮件完毕'%name)
if __name__ == '__main__':
lst = ['alex','egon','eva_j']
lis_l = []
for name in lst:
p = Process(target=send_mail,args=(name,))
p.daemon = True
p.start()
lis_l.append(p)
for p in lis_l:p.join() # 异步阻塞
print('所有的信息都已经发送完毕')

多个进程同时运行

面向对象的方式实现多进程

import os
from multiprocessing import Process class Myprocess(Process):
def f(self):
print(11) def __init__(self,a,b):
super().__init__()
self.a = a
self.b = b
# print(a,b)
def run(self):
self.f()
if __name__ == '__main__':
Myprocess(1,2).start()

面向对象的方式实现多进程

进程与进程之间的数据隔离

关于if __name__ == '__main__':

"""
导入模块的时候实际上是运行了一遍这个模块里面的内容;
写的所有代码是不希望这个文件作为模块被导入的时候执行;
我们就加上if __name__ == '__main'__
"""
在当前文件执行__name__ == 'main'
当该文件作为模块被导入的时候 __name__ == '模块名'

3、守护进程

守护进程会随着主进程的代码结束而结束;

主进程创建守护进程

  其一:守护进程会在主进程代码执行结束后就终止

  其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children

注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止

import os
import time
from multiprocessing import Process class Myprocess(Process):
def __init__(self,person):
super().__init__()
self.person = person
def run(self):
print(os.getpid(),self.name)
print('%s正在和女主播聊天' %self.person) p=Myprocess('哪吒')
p.daemon=True #一定要在p.start()前设置,设置p为守护进程,禁止p创建子进程,并且父进程代码执行结束,p即终止运行
p.start()
time.sleep(10) # 在sleep时查看进程id对应的进程ps -ef|grep id
print('主')

创建守护进程

from multiprocessing import Process

def foo():
print(123)
time.sleep(1)
print("end123") def bar():
print(456)
time.sleep(3)
print("end456") p1=Process(target=foo)
p2=Process(target=bar) p1.daemon=True
p1.start()
p2.start()
time.sleep(0.1)
print("main-------")#打印该行则主进程代码结束,则守护进程p1应该被终止.#可能会有p1任务执行的打印信息123,因为主进程打印main----时,p1也执行了,但是随即被终止.

主进程代码执行结束守护进程立即结束

4、socket server端并发实列

一定要注意循环导入问题:

 

错误示例:

import socket
from multiprocessing import Process
def run(conn):
while True:
msg = conn.recv(1024).decode('utf-8')
print(msg)
if __name__ == '__main__':
sk = socket.socket()
sk.bind(('127.0.0.1', 9000))
sk.listen()
while 1:
conn, addr = sk.accept()
Process(target=run, args=(conn,)).start()

函数式编程实现并发

import socket
from multiprocessing import Process
class Myprocess(Process):
def __init__(self,conn):
super().__init__()
self.conn = conn
def run(self):
while True:
msg = self.conn.recv(1024).decode('utf-8')
print(msg)
if __name__ == '__main__':
sk = socket.socket()
sk.bind(('127.0.0.1',9000))
sk.listen()
while True:
conn,addr = sk.accept()
Myprocess(conn).start()

面向对象实现并发

5、多进程的数据共享问题

from multiprocessing import Process
def func(dic):
dic['count'] -= 1
if __name__ == '__main__':
dic = {'count':100}
lis = []
for i in range(100):
p = Process(target=func,args=(dic,))
p.start()
lis.append(p)
for j in lis:
j.join()
print(dic) # 进程之间的数据是隔离的{'count': 100}修改不生效

多进程数据隔离

om multiprocessing import Manager
def func(dic):
dic['count'] -= 1
if __name__ == '__main__':
m = Manager() # 管理员
dic = m.dict({'count': 100})
lis = []
for i in range(100):
p = Process(target=func,args=(dic,))
p.start()
lis.append(p)
for j in lis:
j.join()
print(dic) # 进程之间的数据是隔离的{'count': 5}修改不生效 # 100减100次1这么慢? 不是减操作造成的 而是开启进程 管理进程 销毁进程拖慢了程序的执行速度
# 为什么在这里出现了数据不安全的现象?
# 什么情况下会出现数据不安全 : Manager类当中对字典\列表 += -= *= /=
# 如何解决 : 加锁

多进程数据共享

使用multiprocessing模块操作进程的更多相关文章

  1. 多进程之multiprocessing模块和进程池的实现

    转载:https://www.cnblogs.com/xiaobeibei26/p/6484849.html Python多进程之multiprocessing模块和进程池的实现 1.利用multip ...

  2. Python多进程之multiprocessing模块和进程池的实现

    1.利用multiprocessing可以在主进程中创建子进程,提升效率,下面是multiprocessing创建进程的简单例子,和多线程的使用非常相似 ''' 代码是由主进程里面的主线程从上到下执行 ...

  3. Python--线程队列(queue)、multiprocessing模块(进程对列Queue、管道(pipe)、进程池)、协程

    队列(queue) 队列只在多线程里有意义,是一种线程安全的数据结构. get与put方法 ''' 创建一个“队列”对象 import queue q = queue.Queue(maxsize = ...

  4. 使用multiprocessing模块创建进程

    #_author:来童星#date:2019/12/17from multiprocessing import Processimport timeimport os#两个子进程将会调用的两个方法de ...

  5. 多进程编程——理论讲解与 multiprocessing 模块

    多进程编程 import os pid = os .fork() 功能 :创建新的进程 参数: 无 返回值 :失败返回一个负数 成功:在原有进程中返回新的进程的PID号 在新进程中返回为0* 子进程会 ...

  6. 进程初识和multiprocessing模块之Process

    一.什么是进程 进程就是运行中的程序 进程是操作系统中最小的资源分配单位 进程与进程之间的关系 : 数据隔离的 进程的id:Process id = pid pid是一个全系统唯一的对某个进程的标识, ...

  7. 30、进程的基础理论,并发(multiprocessing模块)

    我们之前基于tcp所做的通信都只能一个一个链接只有关闭当前链接时才能去链接下一个通信,这显然与现实情况不合.今天我们将来学一个新的概念进程,来做一个python多进程的并发编程.还会贴一个用json序 ...

  8. Python之进程 2 - multiprocessing模块

    ​ 我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起来的python程序也是一个进程,那么我们也可以在程序中再创建进程.多个进程可以实现并发效果,也就是说, ...

  9. 进程的基础理论、并发(multiprocessing模块)

    一.粘包优化方案 之前我们解决粘包的方式是用struct模块来制作一个报头,但是这个解决的方案是有漏洞的,当我们需要传送的文件大于2g时将会报错.所以我们今天将用json来制作报头. from soc ...

随机推荐

  1. nginx日志按天自动切割

    1.编写shell脚本,创建nginx_log.sh文件#!/bin/bashsource /etc/profile#设置Nginx日志文件存放目录log_path="/usr/local/ ...

  2. Project Euler 48 Self powers( 大数求余 )

    题意: 项的自幂级数求和为 11 + 22 + 33 + - + 1010 = 10405071317. 求如下一千项的自幂级数求和的最后10位数字:11 + 22 + 33 + - + 100010 ...

  3. django rest-farme-work 的使用(2)

    serialization (序列化) 本测试项目例子地址为: tomchristie/rest-framework-tutorial 开始构建一个新的程序 创建一个新的环境 virtualenv e ...

  4. Hive sql

    1.DDL操作 1.1 建表 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_ ...

  5. Problem 4

    Problem 4 # Problem_4 """ A palindromic number reads the same both ways. The largest ...

  6. 2、深入学习基本结构——CNN

    这节课主要简单复习一下CNN 从图中例子,1.3共享参数,2.4共享. 要看明白以上参数. 后面就是举例了. 比如声音信号 下面是zero padding 下面是pooling 还可以有mass po ...

  7. 【hihocoder 1304】搜索一·24点

    [题目链接]:http://hihocoder.com/problemset/problem/1304 [题意] [题解] 按照题目给的方法搜索就好; 那个方法很棒啊. 注意除0; 然后是浮点数的比较 ...

  8. openwrt针对RT5350代码下载,配置和编译

    转载地址:http://blog.csdn.net/dean_gdp/article/details/37091685 近期买了块官方板的RT5350: 先介绍代码下载.下面命令都是用登录用户运行,无 ...

  9. (译)RabbitMQ ——“Hello World”

    原文地址:http://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html 介绍 RabbitMQ是一个消息实体服务(broker):它接收及转发消 ...

  10. servletConfig和ServletContext 以及servletContextListener介绍

    <servlet>     <servlet-name>BeerParamTests</servlet-name>     <servlet-class> ...