简介
multiprocessing包是python中用来提供多进程管理的包,能完全利用电脑的多核功能。在Unix与Windows中都能正常使用。
Process模块
Process模块用来生产进程,通过调用start()启动进程。Process与threading.Thread的API一致。
class multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={})
– 通过指定keyword参数来调用构造函数
– group 仅仅是为了保持与threading.Thread的接口一致而存在,不需要设置(默认为None)
– target 进程的函数。
– name 是进程的名字。默认的名字为Process-N1:N2:……
– args 一个tuple,值为target函数的参数,默认为无参数。run() 如果在创建Process时不指定target,那么执行时没有任何效果。因为默认的run方法是判断如果不指定target,那就什么都不做
start() 激活传递给target的进程函数。
join([timeout]) 阻塞调用join的当前线程,直到join进程执行完毕或者timeout
- 如果timeout为None,则无超时
- 一个进程可以join好多次
- 一个进程不能join自己,否则会造成死锁。(阻塞自己直到自己运行完毕)
- 如果进程start之前调用join会导致错误
pid 返回进程的ID,进程生成之前,pid为None
.一个简单的利用Process产生进程的程序如下:
from multiprocessing import Process
def f(num):
print num
if __name__ == '__main__':
p = Process(target=f, args=('susan',))
p.start()
p.join()
- 例子解释run函数的用法
#创建2个进程
p1 = Process()
p2 = Process(target=f2)
p1.run = f1 #p1创建时,没有传递函数给target,启动时不会有任何效果。此处为其执行函数
p1.start()
p2.start()
p1.join() #阻塞当前线程,直到f1执行完毕,再执行p2.join()
p2.join() #阻塞当前线程,直到f2执行完毕,再执行print ’end‘
print ’end‘
- 例子解释join函数的用法
- 正常用法
#创建2个进程
p1 = Process(target=f1)
p2 = Process(target=f2)
p1.start()
p2.start()
p1.join() #阻塞当前线程,直到f1执行完毕,再执行p2.join()
p2.join() #阻塞当前线程,直到f2执行完毕,再执行print ’end‘
print ’end‘
2. 不使用join()
#创建2个进程
p1 = Process(target=f1)
p2 = Process(target=f2)
p1.start()
p2.start()
#p1.join() #启动完p2.start()后,直接运行print 'end',再继续执行完f1和f2
#p2.join()
print ’end‘
3. start()和join()交替使用
#创建2个进程
p1 = Process(target=f1)
p2 = Process(target=f2)
p1.start()
p1.join() #阻塞当前线程,执行完f1后,再执行p2.start()启动f2
p2.start()
p2.join() #阻塞当前线程,执行完f2后,再执行print 'end'
print ’end‘
4. 两个进程只使用一个join()
#创建2个进程
p1 = Process(target=f1)
p2 = Process(target=f2)
p1.start()
p2.start()
p1.join() #阻塞当前线程,执行完f1后,直接执行print ’end‘,再继续f2执行
#p2.join()
print ’end‘