2012-02-11 90 views
2

我使用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,它也不是孩子。

有人知道我沒有的東西嗎?

+1

爲什麼你的'sys.exit(0)'有處理?讓該函數返回。 – Amber 2012-02-11 01:28:12

+0

我試圖確保他們都退出了,因爲這個問題。我沒有嘗試過。 – Chris 2012-02-11 03:07:37

回答

1

我真的不知道答案,但我閱讀Apply_async的文檔,並將其櫃檯似乎與貴公司所提的問題...

回調應立即完成,因爲否則其 處理結果將線程被阻止。

我不熟悉的游泳池,但在我看來,你的用例可以很容易地通過這個食譜上Python Module of the Week

+0

正確...'apply_async'應該完全符合我的要求。池被記錄[在這裏](http://docs.python.org/library/multiprocessing.html),但是我會給'Process'方法一個鏡頭,因爲'Pool'似乎沒有工作。 – Chris 2012-02-11 03:16:26

+0

祝你好運!我也想知道,如果你已經嘗試加入()最後一個過程... – 2012-02-11 04:33:46

+0

我會給你點頭的答案,因爲它似乎將所有切換到'Process'而不是使用'Pool'固定問題。我仍然不確定這是爲什麼,但它現在起作用。 – Chris 2012-02-13 15:16:34

相關問題