解決Python 進程池Pool中一些坑
1 from multiprocessing import Pool,Queue。
其中Queue在Pool中不起作用,具體原因未明。
解決方案:
如果要用Pool創建進程,就需要使用multiprocessing.Manager()中的Queue,
與multiprocessing中的Queue不同
q=Manager().Queue()#Manager中的Queue才能配合Pool po = Pool() # 無窮多進程
2 使用進程池,在進程中調用io讀寫操作。
例如:
p=Pool() q=Manager().Queue() with open('/home/cctv/data/stage_file/stage_{}.txt'.format(int(time.time())), 'w') as w1: p.apply_async(write_json, args=(video_path, 0,0.6,w1,q,i[0],))
這樣也不會完成進程,隻能把w放到具體的函數裡面,不能通過參數調用
補充:python3進程池pool使用及註意事項
1.在python中使用進程池主要就是為瞭並行處理任務,縮短運行時間
2.經常使用方法: 同步有 apply(), map();異步的有 apply_async(), map_async()
3. 先看幾個小例子
import time from multiprocessing import Pool test = [1,2,3,4,5,6,7,8] def run(fn): time.sleep(1) return fn*fn s = time.time() for i in test: run(i) e = time.time() print('直接循環 執行時間:',e - s) pool = Pool(8) s = time.time() for i in test: pool.apply(run, (i,)) e = time.time() print('apply 執行時間:',e - s) pool1 = Pool(8) s = time.time() res = [] for i in test: r = [pool1.apply_async(run, (i,))] res.append(r) pool1.close() pool1.join() e = time.time() print([i.get() for i in r]) print('apply_async 執行時間:',e - s) pool2 = Pool(8) r = pool2.map(run,test) pool2.close() pool2.join() e1 = time.time() print(r) print('map執行時間:',e1 - e) pool3 = Pool(8) pool3.map_async(run,test) pool3.close() pool3.join() e1 = time.time() print('map_async執行時間:',e1 - e)
執行結果
直接循環 執行時間: 8.004754781723022 apply 執行時間: 8.016774654388428 [64] apply_async 執行時間: 1.1128439903259277 [1, 4, 9, 16, 25, 36, 49, 64] map執行時間: 1.181443452835083 map_async執行時間: 2.3679864406585693
除此之外,在寫代碼中,還涉及到變量的一些問題。就需要加鎖~
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- python中multiprosessing模塊的Pool類中的apply函數和apply_async函數的區別
- python基礎之並發編程(二)
- Python 常用模塊threading和Thread模塊之線程池
- 一篇文章帶你搞定Python多進程
- Python使用RPC例子