multiprocessing 是一个支持使用与 threading 模块类似的 API 来产生进程的包。
multiprocessing 包同时提供了本地和远程并发操作,通过使用子进程而非线程有效地绕过了全局解释器锁。
因此,multiprocessing 模块允许程序员充分利用给定机器上的多个处理器。 它在 Unix 和 Windows 上均可运行。
multiprocessing 模块还引入了在 threading 模块中没有的API。
一个主要的例子就是 Pool 对象,它提供了一种快捷的方法,赋予函数并行化处理一系列输入值的能力,可以将输入数据分配给不同进程处理(数据并行)。
multiprocessing支持子进程、通信和共享数据。语法格式如下:
Process([group],[target],[name],[args],[kwargs])
target:表示调用对象(通常指一个函数对象)
args: 表示调用对象的位置参数元组
kwargs:表示调用对象的字典
name: 为别名
group: 参数未使用,值始终为None
Process实例方法表
is_alive() 如果p仍然运行,返回True
join([timeout]) 等待进程p终止。Timeout是可选的超时期限,进程可以被链接无数次,但如果连接自身则会出错
run() 进程启动时运行的方法。默认情况下,会调用传递给Process构造函数的target。定义进程的另一种方法是继承Process类并重新实现run()函数
start() 启动进程,这将运行代表进程的子进程,并调用该子进程中的run()函数
terminate() 强制终止进程。如果调用此函数,进程p将被立即终止,同时不会进行任何清理动作。
如果进程p创建了它自己的子进程,这些进程将变为僵尸进程。使用此方法时需要特别小心。
如果p保存了一个锁或参与了进程间通信,那么终止它可能会导致死锁或I/O损坏
创建子进程并执行
#coding=utf-8
from multiprocessing import Process
def run_test():
print('...run_test...')
if __name__=='__main__':
print('主进程开始执行')
#创建子进程对象,target就是调用对象一般指函数对象
p=Process(target=run_test)
p.start()
结果:
主进程开始执行
...run_test...
创建子进程,传递参数
#coding=utf-8
from multiprocessing import Process
import time
def run_proc(name,age,**kwargs):
print('参数name的值是:%s,age的值是:%d'%(name,age))
print('字典参数的值是:',kwargs)
time.sleep(0.5)
"""
函数的参数:**kwargs表示可变参数,这里为什么会是字典呢?
这是因为在Process()参数中,kwargs指明只能是字典,所以这里接收的时候只能是获取到是字典
"""
if __name__=='__main__':
print('主进程开始执行')
"""
创建子进程传递参数:
target=:表示调用者对象即指函数对象
args: 表示传递给该函数对象的参数列表,用元组表示,当元组只有一个参数时('hdc',),在元素后面需要加上逗号
kwargs: 表示传递给该函数对象的参数字典,用字典表示,注:该字典参数可传可不传
"""
p=Process(target=run_proc,args=('hdc',28),kwargs={'key':30})
#p=Process(target=run_proc,args=('hdc',28))
print('子进程将要执行')
p.start()
结果:
主进程开始执行
子进程将要执行
参数name的值是:hdc,age的值是:28
字典参数的值是: {'key': 30}