-
簡(jiǎn)介
multiprocessing包是python中用來提供多進(jìn)程管理的包,能完全利用電腦的多核功能颇蜡。在Unix與Windows中都能正常使用羡玛。
-
Process模塊
Process模塊用來生產(chǎn)進(jìn)程炊琉,通過調(diào)用start()啟動(dòng)進(jìn)程晓折。Process與threading.Thread的API一致。
class multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={})
- 通過指定keyword參數(shù)來調(diào)用構(gòu)造函數(shù)
- group 僅僅是為了保持與threading.Thread的接口一致而存在呢簸,不需要設(shè)置(默認(rèn)為None)
- target 進(jìn)程的函數(shù)矮台。
- name 是進(jìn)程的名字。默認(rèn)的名字為Process-N1:N2:……
- args 一個(gè)tuple根时,值為target函數(shù)的參數(shù)瘦赫,默認(rèn)為無參數(shù)。run() 如果在創(chuàng)建Process時(shí)不指定target蛤迎,那么執(zhí)行時(shí)沒有任何效果确虱。因?yàn)槟J(rèn)的run方法是判斷如果不指定target,那就什么都不做
start() 激活傳遞給target的進(jìn)程函數(shù)替裆。
-
join([timeout]) 阻塞調(diào)用join的當(dāng)前線程校辩,直到j(luò)oin進(jìn)程執(zhí)行完畢或者timeout
- 如果timeout為None,則無超時(shí)
- 一個(gè)進(jìn)程可以join好多次
- 一個(gè)進(jìn)程不能join自己辆童,否則會(huì)造成死鎖宜咒。(阻塞自己直到自己運(yùn)行完畢)
- 如果進(jìn)程start之前調(diào)用join會(huì)導(dǎo)致錯(cuò)誤
pid 返回進(jìn)程的ID,進(jìn)程生成之前把鉴,pid為None
.一個(gè)簡(jiǎn)單的利用Process產(chǎn)生進(jìn)程的程序如下:
from multiprocessing import Process
def f(num):
print num
if __name__ == '__main__':
p = Process(target=f, args=('susan',))
p.start()
p.join()
- 例子解釋run函數(shù)的用法
#創(chuàng)建2個(gè)進(jìn)程
p1 = Process()
p2 = Process(target=f2)
p1.run = f1 #p1創(chuàng)建時(shí)荧呐,沒有傳遞函數(shù)給target,啟動(dòng)時(shí)不會(huì)有任何效果纸镊。此處為其執(zhí)行函數(shù)
p1.start()
p2.start()
p1.join() #阻塞當(dāng)前線程,直到f1執(zhí)行完畢概疆,再執(zhí)行p2.join()
p2.join() #阻塞當(dāng)前線程逗威,直到f2執(zhí)行完畢,再執(zhí)行print ’end‘
print ’end‘
- 例子解釋join函數(shù)的用法
- 正常用法
#創(chuàng)建2個(gè)進(jìn)程
p1 = Process(target=f1)
p2 = Process(target=f2)
p1.start()
p2.start()
p1.join() #阻塞當(dāng)前線程岔冀,直到f1執(zhí)行完畢凯旭,再執(zhí)行p2.join()
p2.join() #阻塞當(dāng)前線程,直到f2執(zhí)行完畢使套,再執(zhí)行print ’end‘
print ’end‘
2. 不使用join()
#創(chuàng)建2個(gè)進(jìn)程
p1 = Process(target=f1)
p2 = Process(target=f2)
p1.start()
p2.start()
#p1.join() #啟動(dòng)完p2.start()后罐呼,直接運(yùn)行print 'end',再繼續(xù)執(zhí)行完f1和f2
#p2.join()
print ’end‘
3. start()和join()交替使用
#創(chuàng)建2個(gè)進(jìn)程
p1 = Process(target=f1)
p2 = Process(target=f2)
p1.start()
p1.join() #阻塞當(dāng)前線程侦高,執(zhí)行完f1后嫉柴,再執(zhí)行p2.start()啟動(dòng)f2
p2.start()
p2.join() #阻塞當(dāng)前線程,執(zhí)行完f2后奉呛,再執(zhí)行print 'end'
print ’end‘
4. 兩個(gè)進(jìn)程只使用一個(gè)join()
#創(chuàng)建2個(gè)進(jìn)程
p1 = Process(target=f1)
p2 = Process(target=f2)
p1.start()
p2.start()
p1.join() #阻塞當(dāng)前線程计螺,執(zhí)行完f1后夯尽,直接執(zhí)行print ’end‘,再繼續(xù)f2執(zhí)行
#p2.join()
print ’end‘