2017-05-03 104 views
2

有沒有辦法知道進程池已完成運行任務?多處理池已完成任務的非阻塞檢測

_process_pool = mp.Pool(processes=num_workers) 

我加入任務到池分批:

for batch in gen_batches(): 
    _process_pool.map_async(fn, batch) 

有沒有辦法知道,當所有任務已經完成? callback在這裏似乎不起作用。我想避免調用_process_pool.join()

+1

與其他多處理方法相比,池非常有限。我會檢查「從多進程導入過程,管道」。您可以創建工人(Process)。當他們完成後,他們可以通過管道將消息傳遞給主線程。如果你走這條路,確保你閱讀了關於「daemon = True」的內容。這將防止孤兒。 https://docs.python.org/2/library/multiprocessing.html#pipes-and-queues和https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Process.daemon – 16num

+0

我可以也使用Value和Lock的權利?是否有使用全局值和鎖的缺點,而不是將其傳遞給處理器函數? 即使使用全局變量,它也能正常工作。我在這裏錯過了什麼嗎? – vin

回答

2

問題阻止父進程:有沒有辦法知道,當所有任務已經完成?

追加所有AsyncResultpool.map_async(...list,例如:

multiple_results = [] 
for batch in gen_batches(): 
    multiple_results.append(_process_pool.map_async(fn, batch)) 


if all([ar.ready() for ar in multiple_results]): 
    print('Pool done') 
else: 
    print('Pool any alive') 

的Python»3.6.1文檔multiprocessing.pool.AsyncResult

測試使用Python:3.4 .2

+1

謝謝!這也適用於Python 2.7。 – vin