[英]how to "poll" python multiprocess pool apply_async
我有一個這樣的任務 function:
def task (s) :
# doing some thing
return res
原程序是:
res = []
for i in data :
res.append(task(i))
# using pickle to save res every 30s
我需要處理大量數據,我不關心結果的 output 順序。 由於運行時間較長,需要定時保存當前進度。 現在我將其更改為多處理
pool = Pool(4)
status = []
res = []
for i in data :
status.append(pool.apply_async(task, (i,))
for i in status :
res.append(i.get())
# using pickle to save res every 30s
假設我在池中有進程 p0、p1、p2、p3 和 10 個任務,(task(0).... task(9))。 如果 p0 需要很長時間才能完成任務 (0)。
是的
是的,因為流程是異步提交的。 如果輸入可迭代的大小大於最大進程/工作者數, p1
(或其他)也會獲取另一塊數據
“……如何提前得到其他結果”
一種方便的選擇是依賴concurrent.futures.as_completed
,它將在完成時返回結果:
import time
import concurrent.futures
def func(x):
time.sleep(3)
return x ** 2
if __name__ == '__main__':
data = range(1, 5)
results = []
with concurrent.futures.ProcessPoolExecutor(4) as ex:
futures = [ex.submit(func, i) for i in data]
# processing the earlier results: as they are completed
for fut in concurrent.futures.as_completed(futures):
res = fut.result()
results.append(res)
print(res)
樣本 output:
4
1
9
16
另一種選擇是在apply_async(func[, args[, kwds[, callback[, error_callback]]]])
調用上使用callback
; 回調僅接受單個參數作為 function 的返回結果。在該回調中,您可以以最少的方式處理結果(考慮到它僅綁定到一個具體函數的單個參數/結果)。 總體方案如下所示:
def res_callback(v):
# ... processing result
with open('test.txt', 'a') as f: # just an example
f.write(str(v))
print(v, flush=True)
if __name__ == '__main__':
data = range(1, 5)
results = []
with Pool(4) as pool:
tasks = [pool.apply_async(func, (i,), callback=res_callback) for i in data]
# await for tasks finished
但是該模式仍然需要以某種方式等待( get()
結果)提交的任務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.