1 模塊簡(jiǎn)介
multiprocessing模塊在Python2.6中引入。最初的multiprocessing是由Jesse Noller和Richard Oudkerk在PEP 371中定義。就像你可以在threading模塊中使用多個(gè)線程一樣,multiprocessing模塊允許你使用多個(gè)進(jìn)程。當(dāng)你使用多個(gè)進(jìn)程時(shí),你可以避免GIL鎖,并充分利用機(jī)器的多處理器。

multiprocessing庫(kù)包括一些沒有在threading模塊中出現(xiàn)的API。例如,你可以使用Pool類在多個(gè)輸入上并行執(zhí)行一個(gè)函數(shù)。我們將在后面的章節(jié)提到Pool。我們先從multiprocessing中的Process類開始。

2 模塊使用
2.1 開始使用Multiprocessing

Process類與threading中的Thread類非常相似。讓我們嘗試著創(chuàng)建多個(gè)進(jìn)程,這些進(jìn)程都會(huì)調(diào)用同一個(gè)函數(shù),讓我們看看它們是如何工作的,

import os

from multiprocessing import Process

def doubler(number):
    result = number * 2
    proc = os.getpid()
    print("{0} double to {1} by process id:{2}\n".format(number,result,proc))

if __name__ == "__main__":
    numbers = [5,10,15,20,25]
    procs = []
    for index,number in enumerate(numbers):
        proc = Process(target = doubler,args = (number,))
        procs.append(proc)
        proc.start()
    for proc in procs:
        proc.join()
這個(gè)例子中,我們引入Process,然后創(chuàng)建一個(gè)doubler函數(shù)。在doubler函數(shù)中,我們將傳入的數(shù)乘以2。我們也使用Python的os模塊用于獲取當(dāng)前進(jìn)程的ID(或者為pid)。這將會(huì)告訴我們哪個(gè)進(jìn)程正在調(diào)用函數(shù)。在代碼的底部,我們創(chuàng)建了多個(gè)線程,并且啟動(dòng)它們。最后一個(gè)循環(huán)就是在每個(gè)進(jìn)程上調(diào)用join()方法,這個(gè)將會(huì)告訴Python需要等待進(jìn)程終止。如果你需要終止終止一個(gè)進(jìn)程,你可以調(diào)用terminate()方法。

當(dāng)你運(yùn)行這段代碼時(shí),你將會(huì)看到與以下結(jié)果相似的信息,

5 double to 10 by process id:6725

10 double to 20 by process id:6726
20 double to 40 by process id:6728
15 double to 30 by process id:6727



25 double to 50 by process id:6729
有時(shí)候,擁有人類可讀的名字的進(jìn)程會(huì)更加方便。幸運(yùn)的是,Process類允許你獲取進(jìn)程的名字,實(shí)例如下,

import os

from multiprocessing import Process,current_process

def doubler(number):
    result = number * 2
    proc_name = current_process().name
    print("{0} double to {1} by process id:{2}\n".format(number,result,proc_name))

if __name__ == "__main__":
    numbers = [5,10,15,20,25]
    procs = []
    proc = Process(target = doubler, args = (5,))
    for index,number in enumerate(numbers):
        proc = Process(target = doubler,args = (number,))
        procs.append(proc)
        proc.start()
 

網(wǎng)友評(píng)論