二、multiprocessing模块

multiprocessing模块

1、Process类

创建一个进程对象,可是使用该进程对象进行对进程的各种操作,如:创建进程、判断进程、阻塞主进程、终止子进程等

  1. 语法:
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()提交进程的方式为异步

  1. 语法:
from multiprocessing import Process

def zhangsan(name):
    print(name)

if __name__ == '__main__':
    #创建一个进程对象
    p = Process(target=zhangsan, args=('zhangsan',))
    
    #创建子进程,并在子进程中执行 zhangsan函数中的代码
    p.start()
  1. 注意:
'''
注意:
    在windows中,创建进程的代码必须放在以下代码中
        if __name__ == '__main__':
    因为对于,windows来说,他在父进程中创建一个进程,是将该父进程的所有代码都拷贝到新进程中,如果不把创建进程的代码放在上述代码中,那么windows就会一直执行创建进程的代码,从而实现无下限创建下去

    在linux中则无上述问题,但是我们也应该养成将创建进程的代码放入到上述语句中执行
'''

1.2 join()

join是让主进程等待子进程代码运行结束之后,再继续执行代码,并不会影响子进程代码的运行

join 线程和进程都有join方法,且作用基本一致

  1. 语法:
from multiprocessing import Process

p = Process(target[,name[,args[,kwargs]]])

p.join([timeout])

'''
参数介绍:
	timeout:指定等待时间,单位秒;超过该时间则阻塞主进程
'''
  1. 案例:
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

  1. 语法:
from multiprocessing import Process

p = Process(target[,name[,args[,kwargs]]])

p.start()

print(p.is_alive())	#True

1.4 terminate()

不管任务是否完成,立即终止子进程

该方法是让操作系统去执行杀死当前进程操作,所以需要一定的执行时间,并不是立刻杀死当前进程

  1. 语法:
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参数的值

  1. 语法:
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(进程号)

  1. 语法:
from multiprocessing import Process

p = Process(target[,name[,args[,kwargs]]])

p.start()

print(p.pid)	#1024-65535 随机一个进程号

2、current_process类

2.1 pid属性

获取当前进程的pid(进程号)

  1. 语法:
from multiprocessing import current_process

print(current_process().pid)	#1024-65535 随机一个进程号
posted @ 2021-06-03 14:31  zzwYYYYYY  阅读(113)  评论(0)    收藏  举报