在利用Python進行系統(tǒng)管理的時候,特別是同時操作多個文件目錄,或者遠程控制多臺主機,并行操作可以節(jié)約大量的時間。當被操作對象數(shù)目不大時,可以直接利用multiprocessing中的Process動態(tài)成生多個進程,10幾個還好,但如果是上百個,上千個目標,手動的去限制進程數(shù)量卻又太過繁瑣,這時候進程池Pool發(fā)揮作用的時候就到了。
Pool可以提供指定數(shù)量的進程,供用戶調(diào)用,當有新的請求提交到pool中時,如果池還沒有滿,那么就會創(chuàng)建一個新的進程用來執(zhí)行該請求;但如果池中的進程數(shù)已經(jīng)達到規(guī)定最大值,那么該請求就會等待,直到池中有進程結(jié)束,才會創(chuàng)建新的進程來它。這里有一個簡單的例子:
#!/usr/bin/env python#coding=utf-8"""Author: SquallLast modified: 2011-10-18 16:50Filename: pool.pyDescription: a simple sample for pool class"""from multiprocessing import Poolfrom time import sleepdef f(x): for i in range(10): print '%s --- %s ' % (i, x) sleep(1)def main(): pool = Pool(processes=3) # set the processes max number 3 for i in range(11,20): result = pool.apply_async(f, (i,)) pool.close() pool.join() if result.successful(): print 'successful'if __name__ == "__main__": main()
先創(chuàng)建容量為3的進程池,然后將f(i)依次傳遞給它,運行腳本后利用ps aux | grep pool.py查看進程情況,會發(fā)現(xiàn)最多只會有三個進程執(zhí)行。pool.apply_async()用來向進程池提交目標請求,pool.join()是用來等待進程池中的worker進程執(zhí)行完畢,防止主進程在worker進程結(jié)束前結(jié)束。但必pool.join()必須使用在pool.close()或者pool.terminate()之后。其中close()跟terminate()的區(qū)別在于close()會等待池中的worker進程執(zhí)行結(jié)束再關(guān)閉pool,而terminate()則是直接關(guān)閉。result.successful()表示整個調(diào)用執(zhí)行的狀態(tài),如果還有worker沒有執(zhí)行完,則會拋出AssertionError異常。
利用multiprocessing下的Pool可以很方便的同時自動處理幾百或者上千個并行操作,腳本的復(fù)雜性也大大降低。
——————————————————————————————————
Python多進程并發(fā)(multiprocessing)
由于Python設(shè)計的限制(我說的是咱們常用的CPython)。最多只能用滿1個CPU核心。
Python提供了非常好用的多進程包multiprocessing,你只需要定義一個函數(shù),Python會替你完成其他所有事情。借助這個包,可以輕松完成從單進程到并發(fā)執(zhí)行的轉(zhuǎn)換。
1、新建單一進程
如果我們新建少量進程,可以如下:
import multiprocessingimport timedef func(msg):for i in xrange(3):print msgtime.sleep(1)if __name__ == "__main__":p = multiprocessing.Process(target=func, args=("hello", ))</ p.start()p.join()print "Sub-process done."            
新聞熱點
疑難解答