[英]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.