我使用multiprocessing
,特別是Pool
來剝離幾個'線程'來做一堆我有的慢速作業。但是,由於某種原因,即使所有的孩子似乎已經死亡,我也無法讓主線重新加入。Python多處理永遠不會加入
解決的問題:出現這個問題的答案是剛剛啓動多個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,它也不是孩子。
有人知道我沒有的東西嗎?
爲什麼你的'sys.exit(0)'有處理?讓該函數返回。 – Amber 2012-02-11 01:28:12
我試圖確保他們都退出了,因爲這個問題。我沒有嘗試過。 – Chris 2012-02-11 03:07:37