私は依存性トラッキングを持つジョブを実行する簡単な関数を書いています。正確なコードは重要ではありませんが、私が行ったのは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()
期待通りに動作します:
EnumProcessesで親PIDが 'while True'ではなく確認できます。 –
@ g.d.d.c EnumProcessesの使い方は分かりませんが、その部分はマルチプロセッシングですか? –