介紹
Python的multiprocessing模塊不但支持多進(jìn)程,其中managers子模塊還支持把多進(jìn)程分布到多臺(tái)機(jī)器上。一個(gè)服務(wù)進(jìn)程可以作為調(diào)度者,將任務(wù)分布到其他多個(gè)機(jī)器的多個(gè)進(jìn)程中,依靠網(wǎng)絡(luò)通信。想到這,就在想是不是可以使用此模塊來實(shí)現(xiàn)一個(gè)簡(jiǎn)單的作業(yè)調(diào)度系統(tǒng)。在這之前,我們先來詳細(xì)了解下python中的多進(jìn)程管理包multiprocessing。
multiprocessing.Process
multiprocessing包是Python中的多進(jìn)程管理包。它與 threading.Thread類似,可以利用multiprocessing.Process對(duì)象來創(chuàng)建一個(gè)進(jìn)程。該進(jìn)程可以允許放在Python程序內(nèi)部編寫的函數(shù)中。該P(yáng)rocess對(duì)象與Thread對(duì)象的用法相同,擁有is_alive()、join([timeout])、run()、start()、terminate()等方法。屬性有:authkey、daemon(要通過start()設(shè)置)、exitcode(進(jìn)程在運(yùn)行時(shí)為None、如果為–N,表示被信號(hào)N結(jié)束)、name、pid。此外multiprocessing包中也有Lock/Event/Semaphore/Condition類,用來同步進(jìn)程,其用法也與threading包中的同名類一樣。multiprocessing的很大一部份與threading使用同一套API,只不過換到了多進(jìn)程的情境。
這個(gè)模塊表示像線程一樣管理進(jìn)程,這個(gè)是multiprocessing的核心,它與threading很相似,對(duì)多核CPU的利用率會(huì)比threading好的多。
看一下Process類的構(gòu)造方法:
__init__(self, group=None, target=None, name=None, args=(), kwargs={})參數(shù)說明:
group:進(jìn)程所屬組。基本不用 target:表示調(diào)用對(duì)象。 args:表示調(diào)用對(duì)象的位置參數(shù)元組。 name:別名 kwargs:表示調(diào)用對(duì)象的字典。創(chuàng)建進(jìn)程的簡(jiǎn)單實(shí)例:
#coding=utf-8import multiprocessingdef do(n) : #獲取當(dāng)前線程的名字 name = multiprocessing.current_process().name print name,'starting' print "worker ", n return if __name__ == '__main__' : numList = [] for i in xrange(5) : p = multiprocessing.Process(target=do, args=(i,)) numList.append(p) p.start() p.join() print "Process end."
執(zhí)行結(jié)果:
Process-1 startingworker 0Process end.Process-2 startingworker 1Process end.Process-3 startingworker 2Process end.Process-4 startingworker 3Process end.Process-5 startingworker 4Process end.
創(chuàng)建子進(jìn)程時(shí),只需要傳入一個(gè)執(zhí)行函數(shù)和函數(shù)的參數(shù),創(chuàng)建一個(gè)Process實(shí)例,并用其start()方法啟動(dòng),join()方法表示等待子進(jìn)程結(jié)束以后再繼續(xù)往下運(yùn)行,通常用于進(jìn)程間的同步。
注意:
在Windows上要想使用進(jìn)程模塊,就必須把有關(guān)進(jìn)程的代碼寫在當(dāng)前.py文件的if __name__ == ‘__main__' :語句的下面,才能正常使用Windows下的進(jìn)程模塊。Unix/Linux下則不需要。
multiprocess.Pool
當(dāng)被操作對(duì)象數(shù)目不大時(shí),可以直接利用multiprocessing中的Process動(dòng)態(tài)成生多個(gè)進(jìn)程,十幾個(gè)還好,但如果是上百個(gè),上千個(gè)目標(biāo),手動(dòng)的去限制進(jìn)程數(shù)量卻又太過繁瑣,此時(shí)可以發(fā)揮進(jìn)程池的功效。
新聞熱點(diǎn)
疑難解答
圖片精選