簡體   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