二、multiprocessing模块
multiprocessing模块
1、Process类
创建一个进程对象,可是使用该进程对象进行对进程的各种操作,如:创建进程、判断进程、阻塞主进程、终止子进程等
- 语法:
from multiprocessing import Process
'''
注意:
在windows中,创建进程的代码必须放在以下代码中
if __name__ == '__main__':
因为对于,windows来说,他在父进程中创建一个进程,是将该父进程的所有代码都拷贝到新进程中,如果不把创建进程的代码放在上述代码中,那么windows就会一直执行创建进程的代码,从而实现无下限创建下去
在linux中则无上述问题,但是我们也应该养成将创建进程的代码放入到上述语句中执行
'''
if __name__ == '__main':
p = Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
'''
参数介绍:
1.target = 函数名
如果传递了函数的引用,可以认为这个子进程就执行函数内的代码
2.name =
给进程设定一个名字,可以不设定,数据类型为字符串
3.args = (实参1,...)
给target指定的函数传递的实参,以元组的方式传递
4.kwargs = {'参数名1':'参数值1','参数名2':'参数值2',...}
给target指定的函数传递命名参数,以字典的数据类型
5.group参数未使用,值始终为None
'''
1.0 Process常用方法:
- start():启动子进程实例(创建子进程)
- is_alive():判断进程子进程是否还存活,并返回一个bool值
- join([timeout]):是否等待子进程执行结束,可以指定等待时间,单位秒
- terminate():不管任务是否完成,立即终止子进程
Process创建的实例对象的常用属性:
- name:当前进程的别名,默认为'Process-N',N为从1开始递增的整数
- pid:当前进程的pid(进程号),是一个int数据类型的数字
- daemon:默认值为False,如果设为True,代表该子进程为后台运行的守护进程,当p的父进程终止时,该子进程也随之终止,并且设定为True后,该子进程不能创建自己的新进程,必须在该子进程创建之前设置
- exitcode:进程在运行时为None、如果为–N,表示被信号N结束(了解即可)
- authkey:进程的身份验证键,默认是由os.urandom()随机生成的32字符的字符串。这个键的用途是为涉及网络连接的底层进程间通信提供安全性,这类连接只有在具有相同的身份验证键时才能成功(了解即可)
1.1 start()
启动子进程实例,即创建子进程,start()提交进程的方式为异步
- 语法:
from multiprocessing import Process
def zhangsan(name):
print(name)
if __name__ == '__main__':
#创建一个进程对象
p = Process(target=zhangsan, args=('zhangsan',))
#创建子进程,并在子进程中执行 zhangsan函数中的代码
p.start()
- 注意:
'''
注意:
在windows中,创建进程的代码必须放在以下代码中
if __name__ == '__main__':
因为对于,windows来说,他在父进程中创建一个进程,是将该父进程的所有代码都拷贝到新进程中,如果不把创建进程的代码放在上述代码中,那么windows就会一直执行创建进程的代码,从而实现无下限创建下去
在linux中则无上述问题,但是我们也应该养成将创建进程的代码放入到上述语句中执行
'''
1.2 join()
join是让主进程等待子进程代码运行结束之后,再继续执行代码,并不会影响子进程代码的运行
join 线程和进程都有join方法,且作用基本一致
- 语法:
from multiprocessing import Process
p = Process(target[,name[,args[,kwargs]]])
p.join([timeout])
'''
参数介绍:
timeout:指定等待时间,单位秒;超过该时间则阻塞主进程
'''
- 案例:
from multiprocessing import Process
import time
def func(name):
print('{} is running')
time.sleep(3)
print('{} is down')
if __name__ == '__main__':
p = Process(target = func, ages = ('zhangsan',))
p.start()
'''
如果此处不使用 join方法 那么得出结果为:
主
zhangan is running
---阻塞3s
zhangsan is down
此刻父进程与子进程的运行遵守类似先入先出的规则
如果在此处加入 join方法 那么系统就会阻塞主进程,先将子进程的代码执行完成,再去执行主进程:
zhangan is running
---阻塞3s
zhangsan is down
主
'''
print('主')
1.3 is_alive()
判断指定的子进程是否还存活,返回值是一个Bool类型的值
如果存活,返回True
如果死亡,返回False
- 语法:
from multiprocessing import Process
p = Process(target[,name[,args[,kwargs]]])
p.start()
print(p.is_alive()) #True
1.4 terminate()
不管任务是否完成,立即终止子进程
该方法是让操作系统去执行杀死当前进程操作,所以需要一定的执行时间,并不是立刻杀死当前进程
- 语法:
from multiprocessing import Process
p = Process(target[,name[,args[,kwargs]]])
p.start()
p.terminate()
1.5 name属性
返回指定进程的别名,默认为Process-N,N为从1开始递增的整数
如果在实例化进程对象时,Process类加入name参数,那么此处输出的name值,即为name参数的值
- 语法:
from multiprocessing import Process
p = Process(target[,name[,args[,kwargs]]])
p.start()
print(p.name) #Process-1
# 添加name参数
p2 = Process(name = 'zhangsan')
print(p2.name) #zhangsan
1.6 pid属性
返回指定进程的pid(进程号)
- 语法:
from multiprocessing import Process
p = Process(target[,name[,args[,kwargs]]])
p.start()
print(p.pid) #1024-65535 随机一个进程号
2、current_process类
2.1 pid属性
获取当前进程的pid(进程号)
- 语法:
from multiprocessing import current_process
print(current_process().pid) #1024-65535 随机一个进程号

浙公网安备 33010602011771号