繁体   English   中英

嵌套循环中的多处理在 python 中无法正常工作

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM