2015-10-23 121 views
2

我正在使用一個進程池。這種邏輯似乎一直工作到最近。爲什麼我不收割殭屍進程? (CentOS Linux,python)

pool = multiprocessing.Pool(processes = 2*multiprocessing.cpu_count()) 
for p in processArgs: 
    pool.apply_async(myFunc, p) 

pool.close() 
pool.join() 

現在看來,這是在運行時,我結束了在倒閉狀態的所有子進程和父進程似乎沒有對一個事實,即解散過程進行pool.join()但(基於a)仍然存在,並且b)關於接下來發生的邏輯看起來沒有被執行的事實。

殭屍進程是殭屍,對不對?這意味着他們已經死亡,但還沒有被收穫,對嗎?

+0

[ps -el'說他們是殭屍嗎?](https://www.debian-administration.org/article/261/Finding_zombie_processes)你確定池已經完成所有項目的執行嗎? –

+0

它確實表明它們是殭屍(Z存在)。 – vmayer

+0

在執行pool.close()或pool.join()之前,我需要確保退出嗎?說實話,我從一個例子中複製了這個邏輯,並假設遊戲池在完成關閉之前已經完成了所有項目。 – vmayer

回答

0

雖然我不完全理解它,但問題是我正在從我的一個子進程調用sys.exit()。這不是退出子進程的正確方法,應該調用os._exit()來代替:stackoverflow.com/questions/19747371

sys.exit()在退出之前先執行一堆清理操作:也許它被卡住試圖執行一些清理,並且父進程正在等待加入它。

隨意提供額外的解釋,我可以編輯這個答案。