5

を使用する場合、実行中のコードでmpirunシグナル(たとえば、によって生成されたSIGINT)をキャッチすることは可能ですか?^C

たとえば、並列化されたPythonコードを実行しています。except KeyboardInterrupt単独で実行している場合はこれらのエラーをキャッチできますが、実行している場合はキャッチpython blah.pyできませんmpirun -np 1 python blah.py

誰か提案がありますか?CまたはC++でコンパイルされたプログラムでシグナルをキャッチする方法を見つけることでさえ、役立つスタートになるでしょう。

生成されたPythonプロセスにシグナルを送信すると、それらはシグナルを適切に処理できます。ただし、親orterunプロセスに送信された信号(つまり、クラスターで壁時間を超過したり、端末でcontrol-Cを押したりした場合)は、すべてを即座に強制終了します。

4

3 に答える 3

1

を使用する場合はmpirun --nwmpirunサブプロセスの終了を待つのではなく、サブプロセスを開始するとすぐに終了する必要があります。それが許容できる場合は、プロセスが独自のシグナルをキャッチできると思います。

于 2009-07-19T03:08:53.030 に答える
-2

シグナルモジュールは、以下を使用したシグナル ハンドラの設定をサポートしていますsignal.signal

シグナル signalnum のハンドラを関数ハンドラに設定します。handler は、2 つの引数を取る呼び出し可能な Python オブジェクト (以下を参照)、または特別な値 signal.SIG_IGN または signal.SIG_DFL のいずれかです。前のシグナルハンドラが返されます...

import signal
def ignore(sig, stack):
  print "I'm ignoring signal %d" % (sig, )

signal.signal(signal.SIGINT, ignore)
while True: pass

SIGINTこのスクリプトを実行している Python インタープリターに ( 経由で)を送信するkill -INT <pid>と、メッセージが出力され、実行が続行されます。

于 2009-07-17T22:37:22.090 に答える