簡體   English   中英

multiprocessing.pool不終止(python 2.7)

[英]multiprocessing.pool does not terminate (python 2.7)

我對multiprocessing.pool有問題。 即使滿足以下while循環中定義的退出條件,我的工作人員也永遠不會退出。 在最后一個工作人員完成其工作之后,不再進入while循環。 但是,子進程不會像我期望的那樣終止,而是只是閑置而主進程不會繼續。 這是在Ubuntu上。

最后的輸出是“完成”,此后沒有任何反應。 如果在下面添加我注釋掉的行,即handler.get() ,程序將運行並正確終止而不會出現錯誤(僅使用一個進程)。 也許這里有一個明顯的錯誤,但是我沒有主意,不勝感激!

manager = multiprocessing.Manager()
pool = multiprocessing.Pool()
queue = manager.Queue()
lock = manager.Lock()

finished = manager.list()
active = manager.list()
pending = manager.list()

for core in core_list:
     queue.put(core)
     pending.put(core.id)

while len(pending) > 0:
    print "Submit jobs"
    core = queue.get(block=True)
    handler = pool.apply_async(solve_core, (core, core_list, params))
    #handler.get()

pool.close()
pool.join()

def solve_core(core, core_list, params):
    lock.acquire()
    pending.remove(core.id)
    active.append(core.id)
    lock.release()

    # Process some data...

    lock.acquire()
    active.remove(core.id)
    finished.append(core.id)
    for new_core in core_list:
        if some_condition:
            queue.put(new_core)
            pending.append(new_core.id)
    lock.release()
    print "Done"

盡管存在更多的競爭條件錯誤,但仍然存在明顯的競爭條件錯誤。 您的程序將子apply_async依賴為空的pending列表,但是當您使用apply_async ,子apply_async可能無法像while len(pending) > 0循環那樣快地更改pending列表,因此主進程將調用更多次queue.get(block=True)大於隊列的大小,因此,主進程在queue.get被阻塞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM