python多進(jìn)程執(zhí)行方法apply_async使用說明
apply_async簡(jiǎn)介
python在同一個(gè)線程中多次執(zhí)行同一方法時(shí),該方法執(zhí)行耗時(shí)較長(zhǎng)且每次執(zhí)行過程及結(jié)果互不影響,如果只在主進(jìn)程中執(zhí)行,效率會(huì)很低,因此使用multiprocessing.Pool(processes=n)及其apply_async()方法提高程序執(zhí)行的并行度從而提高程序的執(zhí)行效率,其中processes=n為程序并行執(zhí)行的進(jìn)程數(shù)。
apply_async使用簡(jiǎn)明代碼
import multiprocessing #method為多次調(diào)用的方法 def method(param): pass if __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)前進(jìn)程執(zhí)行完畢,隨時(shí)跟進(jìn)操作系統(tǒng)調(diào)度來(lái)進(jìn)行進(jìn)程切換,即多個(gè)進(jìn)程并行執(zhí)行,提高程序的執(zhí)行效率。
補(bǔ)充:記錄python multiprocessing Pool的map和apply_async方法
遇到的問題
在學(xué)習(xí)python多進(jìn)程時(shí),進(jìn)程上運(yùn)行的方法接收多個(gè)參數(shù)和多個(gè)結(jié)果時(shí)遇到了問題,現(xiàn)在經(jīng)過學(xué)習(xí)在這里總結(jié)一下
Pool.map()多參數(shù)任務(wù)
在給map方法傳入帶多個(gè)參數(shù)的方法不能達(dá)到預(yù)期的效果,像下面這樣
def job(x ,y): return x * y if __name__ == "__main__": pool = multiprocessing.Pool() res = pool.map(job, 2, 3) print res
所以只能通過對(duì)有多個(gè)參數(shù)的方法進(jìn)行封裝,在進(jìn)程中運(yùn)行封裝后的方法如下
def job(x ,y): return x * y def job1(z): return job(z[0], z[1]) if __name__ == "__main__": pool = multiprocessing.Pool() res = pool.map(job1, [(2, 3), (3, 4)]) print res
這樣就能達(dá)到傳遞多個(gè)參數(shù)的效果
ps:如果需要得到多個(gè)結(jié)果可以傳入多個(gè)元組在一個(gè)列表中
Pool.apply_async()輸出多個(gè)迭代結(jié)果
在使用apply_async()方法接收多個(gè)參數(shù)的方法時(shí),在任務(wù)方法中正常定義多個(gè)參數(shù),參數(shù)以元組形式傳入即可
但是給apply_async()方法傳入多個(gè)值獲取多個(gè)迭代結(jié)果時(shí)就會(huì)報(bào)錯(cuò),因?yàn)樵摲椒ㄖ荒芙邮找粋€(gè)值,所以可以將該方法放入一個(gè)列表生成式中,如下
def job(x): return x * x if __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兩個(gè)方法
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
pycharm 代碼自動(dòng)補(bǔ)全的實(shí)現(xiàn)方法(圖文)
這篇文章主要介紹了pycharm 代碼自動(dòng)補(bǔ)全的實(shí)現(xiàn)方法(圖文),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
使用CodeMirror實(shí)現(xiàn)Python3在線編輯器的示例代碼
這篇文章主要介紹了使用CodeMirror實(shí)現(xiàn)Python3在線編輯器的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01
Python獲取網(wǎng)頁(yè)數(shù)據(jù)詳解流程
讀萬(wàn)卷書不如行萬(wàn)里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Python來(lái)獲取網(wǎng)頁(yè)的數(shù)據(jù),主要應(yīng)用了Requests庫(kù),大家可以在過程中查缺補(bǔ)漏,提升水平2021-10-10
Django+Celery實(shí)現(xiàn)動(dòng)態(tài)配置定時(shí)任務(wù)的方法示例
這篇文章主要介紹了Django + Celery 實(shí)現(xiàn)動(dòng)態(tài)配置定時(shí)任務(wù)的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
Python3.6 + TensorFlow 安裝配置圖文教程(Windows 64 bit)
這篇文章主要介紹了Python3.6 + TensorFlow 安裝配置的教程(Windows 64 bit),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
在Django的URLconf中使用多個(gè)視圖前綴的方法
這篇文章主要介紹了在Django的URLconf中使用多個(gè)視圖前綴的方法,Django是Python中最為著名的遵循MVC結(jié)構(gòu)的開發(fā)框架,需要的朋友可以參考下2015-07-07

