![](/img/trans.png)
[英]multiprocessing.Pool spawning new childern after terminate() on Linux/Python2.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.