python多進程執(zhí)行方法apply_async使用說明
python在同一個線程中多次執(zhí)行同一方法時,該方法執(zhí)行耗時較長且每次執(zhí)行過程及結(jié)果互不影響,如果只在主進程中執(zhí)行,效率會很低,因此使用multiprocessing.Pool(processes=n)及其apply_async()方法提高程序執(zhí)行的并行度從而提高程序的執(zhí)行效率,其中processes=n為程序并行執(zhí)行的進程數(shù)。
apply_async使用簡明代碼import multiprocessing#method為多次調(diào)用的方法def method(param): passif __name__ == ’__main__’: pool = multiprocessing.Pool(processes=5) params= [’param1’, ’param2’, ’param3’, ’param4’, ’param5’] for param in params: pool.apply_async(method, args=(param, )) pool.close()使用總結(jié):
apply_async是異步非阻塞式,不用等待當(dāng)前進程執(zhí)行完畢,隨時跟進操作系統(tǒng)調(diào)度來進行進程切換,即多個進程并行執(zhí)行,提高程序的執(zhí)行效率。
補充:記錄python multiprocessing Pool的map和apply_async方法
遇到的問題在學(xué)習(xí)python多進程時,進程上運行的方法接收多個參數(shù)和多個結(jié)果時遇到了問題,現(xiàn)在經(jīng)過學(xué)習(xí)在這里總結(jié)一下
Pool.map()多參數(shù)任務(wù)在給map方法傳入帶多個參數(shù)的方法不能達到預(yù)期的效果,像下面這樣
def job(x ,y): return x * yif __name__ == '__main__': pool = multiprocessing.Pool() res = pool.map(job, 2, 3) print res
所以只能通過對有多個參數(shù)的方法進行封裝,在進程中運行封裝后的方法如下
def job(x ,y): return x * ydef job1(z): return job(z[0], z[1])if __name__ == '__main__': pool = multiprocessing.Pool() res = pool.map(job1, [(2, 3), (3, 4)]) print res
這樣就能達到傳遞多個參數(shù)的效果
ps:如果需要得到多個結(jié)果可以傳入多個元組在一個列表中
Pool.apply_async()輸出多個迭代結(jié)果在使用apply_async()方法接收多個參數(shù)的方法時,在任務(wù)方法中正常定義多個參數(shù),參數(shù)以元組形式傳入即可
但是給apply_async()方法傳入多個值獲取多個迭代結(jié)果時就會報錯,因為該方法只能接收一個值,所以可以將該方法放入一個列表生成式中,如下
def job(x): return x * xif __name__ == '__main__': pool multiprocessing.Pool() res = [pool.apply_async(target=job, (i,)) for i in range(3)] print [r.get() for r in res]
python 3中提供了starmap和startmap_async兩個方法
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章:
1. ASP將數(shù)字轉(zhuǎn)中文數(shù)字(大寫金額)的函數(shù)2. ASP基礎(chǔ)入門第四篇(腳本變量、函數(shù)、過程和條件語句)3. jscript與vbscript 操作XML元素屬性的代碼4. XML在語音合成中的應(yīng)用5. JSP開發(fā)之hibernate之單向多對一關(guān)聯(lián)的實例6. 基于PHP做個圖片防盜鏈7. php使用正則驗證密碼字段的復(fù)雜強度原理詳細(xì)講解 原創(chuàng)8. jsp 實現(xiàn)的簡易mvc模式示例9. PHP session反序列化漏洞超詳細(xì)講解10. HTML5實戰(zhàn)與剖析之觸摸事件(touchstart、touchmove和touchend)
