一、multiprocessing模块
python中的多线程无法利用多核优势,如果想要充分地使用多核cpu的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程。python提供了multiprocessing
multiprocessing 模块用来开启子进程。并在子进程中执行我们定制的任务(例如函数)。与多线程threading类似
multiprocessing 模块支持很多功能 :子进程、通信、共享数据,执行不同的同步,提供Process、Queue、Pipe、Lock 等组件
ps:与线程不同,进程没有任何共享状态,修改的数据(改动等等)仅限于该进程内。
二、Process类介绍
创建进程的类
Procss([group [, target [,name [, args [, kwargs ] ] ] ] ] ) ,由该类实例化得到对象,表示一个子进程中的人物(尚未启动)
ps:1. 需要指定关键字的方式来制定参数
2. args 指定为传给 target 函数位置,是一个元组形式,必须有逗号
参数介绍
1. group 参数 未使用 ,值始终为 None 2. target 表示 调用对象 , 即子进程要执行的任务(不加括号) 3. args 表示调用对象的位置参数元组,args = (x , y ,) 4. kwargs 表示调用对象的字典,kwargs={'x':1 , 'y':99} 5. name 为子进程的名称
方法介绍
1. p.start() :启动进程,并调用该子进程的 p.run() 2. p.run() :进程启动时运行的方法 ,它去调用target指定的函数,自定义的类一定要实现该方法。 3. p.terminate() :强制终止进程p ,不会进行任何清理操作,如果p创建了子进程,该子进程就变成僵尸进程了,使用该方法需要小心这个情况,如果p还保存了一个锁 那么也将不会被释放,进而导致死锁 4. p.is_alive() : 如果p仍然运行,返回True 5. p.join([timeout]) :主进程等待p终止 (ps:是主线程处于等 的状态,而p是处于运行的状态),timeout是可选的超时时间,需要强调的是,p.join 只能join 住 start 开启的进程,而不能join住 run开启的进程
属性介绍
1. p.daemon : 默认为False , 如果设为True ,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设置完后,p不能创建自己的新进程,必须在p.start() 之前设置。 2. p.name :进程的名称 3. p.pid :进程的pid 4. p.exitcode :进程运行时为None、如果为-N ,表示被信号N结束(了解) 5. p.authkey :进程的身份验证键,默认是由 os.urandom()随机生成的32位字符串,这个键的用途是为涉及网络连接的底层进程间通信提供安全性,这类连接只有在具有相同身份验证键时才算成功(了解)
三、Process类的使用
在windows中Process()必须放到# if __name__ == '__main__':下
创建并开启子进程的两种方式
# 开启子进程的方式1: from multiprocessing import Process import time def task(name): print('%s is running' %name) time.sleep(3) print('%s is done' %name) # 在windows系统上开启子进程的操作必须放到该行代码下 if __name__ == '__main__': p=Process(target=task,args=('子进程',)) # Process(target=task,kwargs={'name':'子进程'}) # p.start() # 仅仅只是向操作系统发送一个创造子进程的信号 print('主')