multiprocessing 是一個(gè)支持使用與 threading 模塊類似的 API 來產(chǎn)生進(jìn)程的包愈犹。 multiprocessing 包同時(shí)提供了本地和遠(yuǎn)程并發(fā)操作筋量,通過使用子進(jìn)程而非線程有效地繞過了 全局解釋器鎖唧瘾。 因此,multiprocessing 模塊允許程序員充分利用給定機(jī)器上的多個(gè)處理器。 它在 Unix 和 Windows 上均可運(yùn)行岸裙。
multiprocessing模塊提供了一個(gè)Process類來代表一個(gè)進(jìn)程對(duì)象
1、multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
- target 是函數(shù)名字速缆,需要調(diào)用的函數(shù)
- args 函數(shù)需要的參數(shù)降允,以 tuple 的形式傳入
- 將daemon設(shè)置為True時(shí),則主線程不必等待子進(jìn)程艺糜,主線程結(jié)束則所有結(jié)束
2剧董、相關(guān)方法
- star() 方法啟動(dòng)進(jìn)程,
- join() 方法實(shí)現(xiàn)進(jìn)程間的同步破停,等待所有進(jìn)程退出翅楼。
- close() 用來阻止多余的進(jìn)程涌入進(jìn)程池 Pool 造成進(jìn)程阻塞。真慢、
from multiprocessing import Process
import os
def run_proc(name):
print('Run child process %s (%s)...' % (name, os.getpid()))
if __name__ == '__main__':
print('Parent process %s.' % os.getpid())
p = Process(target = run_proc, args = ('test', ))
p.start()
p.join()
print('End')
輸出結(jié)果如下:
Parent process 26524.
Run child process test (13336)...
End
如果要啟動(dòng)大量的子進(jìn)程毅臊,可以用進(jìn)程池的方式批量創(chuàng)建子進(jìn)程
Pool提供了一種快捷的方法,賦予函數(shù)并行化處理一系列輸入值的能力黑界,可以將輸入數(shù)據(jù)分配給不同進(jìn)程處理(數(shù)據(jù)并行)管嬉。下面的例子演示了在模塊中定義此類函數(shù)的常見做法皂林,以便子進(jìn)程可以成功導(dǎo)入該模塊。這個(gè)數(shù)據(jù)并行的基本例子使用了 Pool 宠蚂。
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
with Pool(5) as p:
print(p.map(f, [1, 2, 3]))
將在標(biāo)準(zhǔn)輸出中打印
[1, 4, 9]
其中:
(1)p.apply(func [, args [, kwargs]]):在一個(gè)池工作進(jìn)程中執(zhí)行func(args,kwargs),然后返回結(jié)果式撼。需要強(qiáng)調(diào)的是:此操作并不會(huì)在所有池工作進(jìn)程中并執(zhí)行func函數(shù)。如果要通過不同參數(shù)并發(fā)地執(zhí)行func函數(shù)求厕,必須從不同線程調(diào)用p.apply()函數(shù)或者使用p.apply_async()
(2)p.apply_async(func [, args [, kwargs]]):在一個(gè)池工作進(jìn)程中執(zhí)行func(args,**kwargs),然后返回結(jié)果著隆。此方法的結(jié)果是 AsyncResult類的實(shí)例,callback是可調(diào)用對(duì)象呀癣,接收輸入?yún)?shù)美浦。當(dāng)func的結(jié)果變?yōu)榭捎脮r(shí),將理解傳遞給callback项栏。callback禁止執(zhí)行任何阻塞操作浦辨,否則將接收其他異步操作中的結(jié)果。多進(jìn)程并發(fā)沼沈!
(3)p.close():關(guān)閉進(jìn)程池流酬,防止進(jìn)一步操作。如果所有操作持續(xù)掛起列另,它們將在工作進(jìn)程終止前完成
(4)p.jion():等待所有工作進(jìn)程退出芽腾。此方法只能在close()或teminate()之后調(diào)用