2013-08-19 43 views
2

我一直在使用下面的方法在Python中實現並行的子進程:實現按Ctrl + C取消在python多處理

pool = multiprocessing.Pool(processes=4) 
pool.map_async(my_parallel_func ....) 
pool.close() 
pool.join() 

這些任務將幾分鐘運行。而且我注意到在這期間阻止等待,我不能按Ctrl + c取消到主腳本。如果我打到Ctrl + c,我會得到一個堆棧打印,程序不會停止,但它會成爲一個殭屍進程。我必須手動殺死每個子進程。

如何讓程序通過按Ctrl +Ç退出,也同時終止所有子進程?

+1

子流程必須被告知單獨關閉。參見[這裏](http://stackoverflow.com/q/1231599/102937)瞭解一些指導。 –

回答

0

問題是Ctrl + c只殺死一個執行異步映射的池中的進程;一旦它被殺死,經理就會使用新流程重新執行任務。你需要做的是在my_parallel_func的頂層有一個except KeyboardInterrupt:,然後這可以通過對主進程的一些特殊值來告訴整個進程樹應該死掉。

+0

將例外置入'my_parallel_func'不起作用。它實際上是等待的'pool.join()'。我想知道如果沒有進程間通信這是可能的嗎? –

+0

在我的電腦上,linux 3.8,ctrl + c殺死了處理池中的一個進程......所以它看起來不一樣... –