多进程
- 更方便高效的进程创建方法
-
multiprocessing
模块 (标准库模块) - 使用
multiprocessing
创建子进程,同样子进程复制父进程的全部代码段,父子进程各自执行互不影响,父子进程有各自的运行空间
创建进程的步骤
- 需要将要执行的事情封装为函数
- 使用
multiprocessing
模块中Process
类创建进程对象 - 通过对象属性设置和
Process
的初始化函数对进程进行设置,绑定要执行的函数 - 启动进程,会自动执行进程绑定的函数
- 完成进程的回收
进程的回收
- 阻塞等待对应子进程的退出,然后回收子进程
- 内核会帮助应用层记录子进程的退出情况,当使用
join
函数时内核会及时返回进程状态给应用层进行处理
创建子进程
Process()
创建进程对象
- 参数:
-
target
指定要绑定的函数 -
name
给创建的进程起一个名字 -
args
需要一个元组,给target
指定的函数按位置传参 -
kwargs
需要一个字典,给taregt
指定的函数按键值传参
-
- 属性与方法(
p
代表一个进程)-
p.name
进程名称 -
p.pid
进程PID -
p.daemon
-
False
(默认值)表示主进程运行结束后,不会影响子进程的运行,直到所有子进程运行完毕,进程才会结束 -
True
主进程运行完毕则所有子进程也不再运行一起退出。 - 注意:
- 该属性的设置必须要在
start()
前 - 该属性的设置并不是将进程设置为linux/unix中的守护进程
- 该属性的设置必须要在
-
-
p.is_alive()
判断进程生命周期状态,处于生命周期得到True
否则返回False
-
p.start()
启动子进程,target函数会自动执行,此时进程真正被创建 -
p.join()
阻塞等待回收子进程- 参数:
p.join(timeout)
设置最长阻塞时间,如果超过这个时间还没有子进程退出,则不会继续等待
- 参数:
-
- 注意
- 函数当付给
Process
的target
变量后函数内容就是对应进程的进程内容,此时函数才有特殊性 - 多个子进程和父进程之间的执行互不影响
- 使用
multiprocessing
创建子进程,同样子进程复制父进程的全部代码段,父子进程各自执行互不影响,父子进程有各自的运行空间 - 如果不使用
join
回收子进程则子进程退出后会成为僵尸进程 - 使用
multiprocessing
创建子进程往往父进程只是用来创建进程回收进程 - 如果子进程从父进程拷贝对象,对象和网络或者文件相关联,那么父子进程会使用同一套对象属性,相互有一定的关联性
- 如果在子进程中单独创建对象,则和父进程完全没有关联
- 函数当付给
# process1.py
from multiprocessing import Process
from time import sleep
import os
def worker(sec,name):
for i in range(3):
sleep(sec)
print("I'm %s" % name)
print("I'm working ...")
p = Process(target = worker,\
kwargs = {'sec':2,'name':'Jason'})
p.start()
print('Process name',p.name)
print('Process PID',p.pid)
print('Process is alive or not:',p.is_alive())
print('Parent pid',os.getpid())
p.join()
自定义进程类
- 继承
Process
类以获取原有的属性 - 编写自己的
__init__
,同时加载父类init
方法 - 重写
run
方法,可以通过生成的对象调用start
自动运
# myProcess.py
from multiprocessing import Process
import time
class myProcess(Process):
def __init__(self,value):
self.value = value
super(myProcess,self).__init__()
def run(self):
for i in range(5):
print('This is my process {}'.format(time.ctime()))
time.sleep(self.value)
p = myProcess(1)
p.start()
p.join()
多进程的优缺点
优点
- 可以并行执行多个任务,提高运行效率
- 空间独立,数据安全
- 运行不受其他进程影响,创建方便
缺点
- 进程的创建和销毁过程需要消耗较多的计算机资源
- 在需要频繁的创建和销毁较多进程情况下,资源消耗过多,不适宜使用多进程完成任务
网友评论