2014-02-19 55 views
0

我有一個啓動子進程(當前爲64)並執行一些工作的應用程序。 每個進程在大約45分鐘後完成,但父進程似乎掛起,因爲父進程不會退出並掛起在連接循環中。已完成子進程但父進程掛起

我開始proccesses這樣的:

def worker(out_q): 
    # do something that takes a lot of time 
    print('done working') 
    sys.exit(0) 

def main(): 
    procs = [] 
    out_q = Queue() 

    for i in range(opt.num_threads): 
     sys.stdout.write("\r\tStarting Worker Process: %d" %(i+1)) 
     sys.stdout.flush() 
     p = multiprocessing.Process(target=worker, args=(out_q,)) 
     procs.append(p) 
     p.start() 

    #then i wait for all processes to finish: 

    try: 
     for i, p in enumerate(procs): 
      print("waiting for process %d" %i) 
      p.join() 
      print("process %d joined" %i) 
    except KeyboardInterrupt as e: 
     sys.exit(0) 
if __name__ == "__main__": 
    main() 

唯一的輸出我看到的是waiting for process 0和所有工序均由內部完成後(我看到說done working所有的進程,還有在進程列表中所有64個流程,父進程沒有完成 似乎父進程掛起,因爲它不能被任務管理器殺死。

我該如何調試,或者我需要殺死進程?爲什麼進程沒有調用sys.exit(0)後,從進程列表中刪除想孩子嗎?

+0

工作人員是否在'out_q'中放置了某些東西?你是否消耗隊列? –

+0

是的,他們這樣做。我在這裏看到這一個http://bugs.python.org/issue8237我現在檢查隊列得到了多滿,並嘗試執行一個隊列沖洗... – reox

回答

0

這可能不是掛斷的直接原因。

您需要將參數傳遞爲元組(out_q,)或列表[out_q]

p = multiprocessing.Process(target=worker, args=(out_q,)) 
#            ^^^^^^^ 
+0

啊不,這只是一個複製和粘貼錯誤...工人有更多的論據,我把它們分解了下來。 如果運行時間較短,整個事情就會起作用。所以這個問題只發生在長時間運行時間> 10min – reox

+0

@reox,你是否用'if if __name__ =='__main__'來保護多進程相關的代碼:..'? – falsetru

+0

是的,我會將其附加到我發佈的代碼。 – reox

1

你不應該在worker功能做exit(0)。在它有機會將成功報告給家長之前,這會殺死你的子流程。換句話說,在調用task_done()之前子進程被殺死,因此p.join()將永遠等待。

+0

但工作人員並沒有死亡 - 我可以在procexplorer中看到過程映像。 即使我不做sys.exit(0),父進程掛在那個循環... 我會再試一次沒有sys.exit(0) - 可能需要一段時間 – reox

+0

@reox:爲什麼不'你是否在測試你的多處理代碼來評論耗時的部分? – vartec

+0

,因爲那樣一切正常;)正如所說:只有當我讓它運行一段時間纔會出現問題。 我在耗時的部分想到了一個問題,但是當每個進程到達最後並報告它已經完成時,我不認爲問題在那裏 – reox