2016-04-15 21 views
0

私は依存性トラッキングを持つジョブを実行する簡単な関数を書いています。正確なコードは重要ではありませんが、私が行ったのはmultiprocessing.Processでフォークするジョブ監視機能を作成し、2つのマルチプロセッシングQueueオブジェクトを使ってジョブを送受信します。Pythonマルチプロセッシング:終了時にワーカーを終了させる

それは素晴らしい作品が、私は無限ループを使用しているため、親プロセスは、終了時にハングアップしたときに、Pythonはまだ子供を待っているので。終了時に子プロセスをすぐに終了させる良い方法はありますか?多分信号を捕まえることによって?

私の実際のコードはここにある: https://gist.github.com/MikeDacre/e672969aff980ee950b9dfa8b2552d40 Aより完全な例はここにある: はhttp://nbviewer.jupyter.org/github/MikeDacre/python-cluster/blob/cluster/tests/local_queue.ipynb

おもちゃの例では、しかし、おそらくより良いです:Ctrl + Cキーがあるまで喜んでハングします

import multiprocessing as mp 
from time import sleep 
def runner(): 
    while True: 
     sleep(2) 

runner = mp.Process(target=runner) 
runner.start() 
exit() 

入力されました。

通常の終了時に送信されるいかなる信号が存在しないように私は、シグナルキャッチがうまくいくとは思いません。キャッチする方法はありますかexit()?そうでない場合は、自然に終了する方法でプロセスを作成する方法はありますか?

import atexit 
import multiprocessing as mp 
from time import sleep 
def runner(): 
    while True: 
     sleep(2) 

def kill_runner(runner): 
    runner.terminate() 

runner = mp.Process(target=runner) 
runner.start() 
atexit.register(kill_runner, runner) 
exit() 

期待通りに動作します:

+2

EnumProcessesで親PIDが 'while True'ではなく確認できます。 –

+0

@ g.d.d.c EnumProcessesの使い方は分かりませんが、その部分はマルチプロセッシングですか? –

答えて

0

おかげで誰もが、すぐにこの質問を書いた後、私はPythonのatexitモジュールを使用して解決策を考え出しました。

関連する問題