Python多程序併發(multiprocessing)用法例項詳解
python多執行緒的限制
python多執行緒有個討厭的限制,全域性直譯器鎖(global interpreter lock),這個鎖的意思是任一時間只能有一個執行緒使用直譯器,跟單cpu跑多個程式一個意思,大家都是輪著用的,這叫“併發”,不是“並行”。手冊上的解釋是為了保證物件模型的正確性!這個鎖造成的困擾是如果有一個計算密集型的執行緒佔著cpu,其他的執行緒都得等著....,試想你的多個執行緒中有這麼一個執行緒,得多悲劇,多執行緒生生被搞成序列;當然這個模組也不是毫無用處,手冊上又說了:當用於IO密集型任務時,IO期間執行緒會釋放直譯器,這樣別的執行緒就有機會使用直譯器了!所以是否使用這個模組需要考慮面對的任務型別。Python多程序併發(multiprocessing)用法 multiprocessing模組程序操作的相關技巧
例項講述了Python多程序併發(multiprocessing)用法。分享給大家供大家參考。具體分析如下:
由於Python設計的限制(我說的是咱們常用的CPython)。最多隻能用滿1個CPU核心。
Python提供了非常好用的多程序包multiprocessing,你只需要定義一個函式,Python會替你完成其他所有事情。藉助這個包,可以輕鬆完成從單程序到併發執行的轉換。
1、新建單一程序
如果我們新建少量程序,可以如下:
?1234567891011 | import multiprocessing import time def func(msg): for i in xrange ( 3 ): print msg time.sleep( 1 ) if __name__ = = "__main__" : p = multiprocessing.Process(target = func, args = ( "hello" , )) p.start() p.join() print "Sub-process done." |
2、使用程序池
Pool類可以提供指定數量的程序供使用者呼叫,當有新的請求提交到Pool中時,如果池還沒有滿,就會建立一個新的程序來執行請求。如果池滿,請求就會告知先等待,直到池中有程序結束,才會建立新的程序來執行這些請求。
它可以讓你跑滿多核CPU,而且使用方法非常簡單。
注意要用apply_async,如果落下async,就變成阻塞版本了。
processes=4是最多併發程序數量。
?1234567891011121314 | import multiprocessing import time def func(msg): for i in xrange ( 3 ): print msg time.sleep( 1 ) if __name__ = = "__main__" : pool = multiprocessing.Pool(processes = 4 ) for i in xrange ( 10 ): msg = "hello %d" % (i) pool.apply_async(func, (msg, )) pool.close() pool.join() print "Sub-process(es) done." |
3、使用Pool,並需要關注結果
更多的時候,我們不僅需要多程序執行,還需要關注每個程序的執行結果,如下:
?123456789101112131415161718 | import multiprocessing import time def func(msg): for i in xrange ( 3 ): print msg time.sleep( 1 ) return "done " + msg if __name__ = = "__main__" : pool
|