[英]multiprocessing in nested loop not work properly in python
代碼就像
def function():
for i in range(100):
image1 = image_list[0,i]
image2 = image_list[1,i]
pool = Pool(3)
for j in range(3):
pool.apply_async(some_function, (image1, image2))
pool.close()
pool.join
function 在 i=0 時工作正常,但當 i=1(第二輪 main for 循環)時,池似乎無法正常工作(停止調用 some_function)。
那么如何處理這樣的多處理任務
請參閱如何創建最小的、可重現的示例。
您應該在for i in range(100:
之前創建一次池,而不是一遍又一遍地創建池。並且由於您當前擁有for j in range(3):
塊,在j
為 0 時調用apply_async
之后(即第一次),您將立即調用pool.close()
和pool.join()
。這將 (1) 阻塞直到第一個提交的任務完成,並且 (2) 阻止您向池提交更多任務(即j
等於 2 和 3)。假設您要提交所有 300 個任務,然后等待它們完成,您想要的更接近以下內容:
def function():
pool = Pool()
for i in range(100):
image1 = image_list[0,i]
image2 = image_list[1,i]
for j in range(3):
pool.apply_async(some_function, (image1, image2))
# Wait for the 300 tasks to complete:
pool.close()
pool.join()
請注意,我們不再使用 3 的池大小,而是使用等於我們擁有的 CPU 內核數的池大小,因為我們一次提交所有 300 個任務。 我還假設some_function
嚴重受 CPU 限制,因此使用更大的池沒有任何好處。
但是,如果您想一次提交任務 3 並等待它們完成后再提交下一個 3,那么:
def function():
pool = Pool(3)
for i in range(100):
image1 = image_list[0,i]
image2 = image_list[1,i]
async_results = [pool.apply_async(some_function, (image1, image2)) for j in range(3)]
# wait for all 3 tasks to complete without using pool.close()
# and pool.join():
for async_result in async_results:
# Wait for this task to complete and get return value,
# which we are not saving:
async_result.get()
# Only when we have finished submitting our 300 tasks do we cleanup
# the pool:
pool.close()
pool.join
請注意,我提供了兩個版本的代碼,因為您不清楚您到底想要做什么。 請參閱如何提出一個好問題? .
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.