簡體   English   中英

Python多重處理永遠不會加入

[英]Python multiprocessing never joins

我正在使用multiprocessing ,特別是使用Pool來剝離幾個“線程”來完成我的一堆緩慢的工作。 但是,由於某些原因,即使所有孩子似乎都已死亡,我也無法重新加入主線程。

解決:此問題的答案似乎是僅啟動多個Process對象,而不是使用Pool 尚不清楚原因為何,但我懷疑剩余的過程是池的管理者,並且在過程完成時不會死。 如果其他人有這個問題,這就是答案。


主線

pool = Pool(processes=12,initializer=thread_init)
for x in xrange(0,13):
    pool.apply_async(thread_dowork)
pool.close()
sys.stderr.write("Waiting for jobs to terminate\n")
pool.join()

xrange(0,13)比進程數多一個,因為我以為自己差了一個,而且一個進程沒有找到工作,所以沒有死,我想強迫它去做一份工作。 我也嘗試過12。

多處理功能

def thread_init():
    global log_out
    log_out = open('pool_%s.log'%os.getpid(),'w')
    sys.stderr = log_out
    sys.stdout = log_out
    log_out.write("Spawned")
    log_out.flush()
    log_out.write(" Complete\n")
    log_out.flush()


def thread_dowork():
    log_out.write("Entered function\n")
    log_out.flush()
    #Do Work
    log_out.write("Exiting ")
    log_out.flush()
    log_out.close()
    sys.exit(0)

所有12個子級的日志文件的輸出為:

Spawned
Complete
Entered function
Exiting

主線程打印“正在等待作業終止”,然后坐在那里。

top僅顯示該腳本的一個副本(我相信主要副本)。 htop顯示了兩個副本,其中一個是自上而下的副本,另一個是其他副本。 根據其PID,它也不是任何子級。

有人知道我不知道的事嗎?

我真的沒有答案,但我閱讀了Apply_async的文檔,似乎與您所說的問題背道而馳...

回調應該立即完成,因為否則處理結果的線程將被阻塞。

我不熟悉Pool,但在我看來, 本周Python模塊上的此食譜很容易處理您的用例

暫無
暫無

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

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