apply_async簡介
python在同一個線程中多次執(zhí)行同一方法時,該方法執(zhí)行耗時較長且每次執(zhí)行過程及結果互不影響,如果只在主進程中執(zhí)行,效率會很低,因此使用multiprocessing.Pool(processes=n)及其apply_async()方法提高程序執(zhí)行的并行度從而提高程序的執(zhí)行效率,其中processes=n為程序并行執(zhí)行的進程數。
apply_async使用簡明代碼
import multiprocessing
#method為多次調用的方法
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()
使用總結:
apply_async是異步非阻塞式,不用等待當前進程執(zhí)行完畢,隨時跟進操作系統(tǒng)調度來進行進程切換,即多個進程并行執(zhí)行,提高程序的執(zhí)行效率。
補充:記錄python multiprocessing Pool的map和apply_async方法
遇到的問題
在學習python多進程時,進程上運行的方法接收多個參數和多個結果時遇到了問題,現在經過學習在這里總結一下
Pool.map()多參數任務
在給map方法傳入帶多個參數的方法不能達到預期的效果,像下面這樣
def job(x ,y):
return x * y
if __name__ == "__main__":
pool = multiprocessing.Pool()
res = pool.map(job, 2, 3)
print res
所以只能通過對有多個參數的方法進行封裝,在進程中運行封裝后的方法如下
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
這樣就能達到傳遞多個參數的效果
ps:如果需要得到多個結果可以傳入多個元組在一個列表中
Pool.apply_async()輸出多個迭代結果
在使用apply_async()方法接收多個參數的方法時,在任務方法中正常定義多個參數,參數以元組形式傳入即可
但是給apply_async()方法傳入多個值獲取多個迭代結果時就會報錯,因為該方法只能接收一個值,所以可以將該方法放入一個列表生成式中,如下
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兩個方法
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- 分析詳解python多線程與多進程區(qū)別
- 手把手帶你了解python多進程,多線程
- Python多進程共享numpy 數組的方法
- 總結python多進程multiprocessing的相關知識
- Python多線程與多進程相關知識總結
- python實現多進程并發(fā)控制Semaphore與互斥鎖LOCK
- python 多進程和多線程使用詳解
- python 實現多進程日志輪轉ConcurrentLogHandler
- Python多進程與多線程的使用場景詳解
- Python 多進程原理及實現
- python多線程和多進程關系詳解
- Python多進程的使用詳情