MPI信号处理
使用mpirun
时,是否可以在正在运行的代码中捕获信号(例如,由^C
生成的SIGINT)?MPI信号处理
例如,我正在运行一个并行化的Python代码。我可以用except KeyboardInterrupt
自己运行python blah.py
来捕捉这些错误,但我不能在做mpirun -np 1 python blah.py
时。
有没有人有建议?即使找到如何在C或C++编译的程序中捕捉信号也是一个有益的开始。
如果我向派生的Python进程发送信号,他们可以正确处理信号;然而,发送到父节点的信号(即,超过群集上的挂机时间,或者在终端中按下control-C)将立即终止一切。
的signal模块支持使用signal.signal
设置信号处理程序:
Set the handler for signal signalnum to the function handler. handler can be a callable Python object taking two arguments (see below), or one of the special values signal.SIG_IGN or signal.SIG_DFL. The previous signal handler will be returned ...
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>
),它将打印一条消息,简单地继续跑。
如果您使用mpirun --nw
,那么mpirun
本身应该在其开始子流程时立即终止,而不是等待它们的终止;如果这是可以接受的,那么我相信你的程序将能够捕捉到他们自己的信号。
由于某种原因,我的mac上的mpirun无法识别此参数(即使它出现在“man”中)。 `mpirun -n 2 --nw python test.py`会给出错误:`找不到以下可执行文件:可执行文件:--nw`,并且我尝试了不同的参数排列,并尝试使用`-nw`来代替好。任何想法是什么?谢谢。 – 2009-07-19 17:45:27
谢谢,但不幸的是,这并没有真正回答我的问题。我不想知道如何截取Python中的信号;我想知道如何防止`mpirun`首先捕获它们,或者如何从runner中传递它们(`orted`或`ortedrun`)。当执行`mpirun -np 1 python test.py`时,当我点击control-C或当我发送ortedrun信号时它仍然会死掉。 (如果我确实发现了ortrun生成并发出信号的Python解释器的pid,这可行;但这不是我想要的。) – 2009-07-18 04:23:29