2009-07-17 130 views
3

使用mpirun时,是否可以在正在运行的代码中捕获信号(例如,由^C生成的SIGINT)?MPI信号处理

例如,我正在运行一个并行化的Python代码。我可以用except KeyboardInterrupt自己运行python blah.py来捕捉这些错误,但我不能在做mpirun -np 1 python blah.py时。

有没有人有建议?即使找到如何在C或C++编译的程序中捕捉信号也是一个有益的开始。

如果我向派生的Python进程发送信号,他们可以正确处理信号;然而,发送到父节点的信号(即,超过群集上的挂机时间,或者在终端中按下control-C)将立即终止一切。

回答

-1

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>),它将打印一条消息,简单地继续跑。

+1

谢谢,但不幸的是,这并没有真正回答我的问题。我不想知道如何截取Python中的信号;我想知道如何防止`mpirun`首先捕获它们,或者如何从runner中传递它们(`orted`或`ortedrun`)。当执行`mpirun -np 1 python test.py`时,当我点击control-C或当我发送ortedrun信号时它仍然会死掉。 (如果我确实发现了ortrun生成并发出信号的Python解释器的pid,这可行;但这不是我想要的。) – 2009-07-18 04:23:29

0

如果您使用mpirun --nw,那么mpirun本身应该在其开始子流程时立即终止,而不是等待它们的终止;如果这是可以接受的,那么我相信你的程序将能够捕捉到他们自己的信号。

+1

由于某种原因,我的mac上的mpirun无法识别此参数(即使它出现在“man”中)。 `mpirun -n 2 --nw python test.py`会给出错误:`找不到以下可执行文件:可执行文件:--nw`,并且我尝试了不同的参数排列,并尝试使用`-nw`来代替好。任何想法是什么?谢谢。 – 2009-07-19 17:45:27