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

3

我认为这真的取决于实现。

SIGINT, SIGUSR1, SIGUSR2将绕过进程。

I_MPI_JOB_SIGNAL_PROPAGATION并可I_MPI_JOB_TIMEOUT_SIGNAL设置发送信号。

还有一点值得注意:对于很多python脚本,它们会通过cython调用其他库或代码,如果被子SIGUSR1进程捕获,可能会发生一些不想要的事情。

于 2018-03-22T01:53:48.623 回答
1

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

于 2009-07-19T03:08:53.030 回答
-2

信号模块支持使用以下设置信号处理程序signal.signal

将信号 signalnum 的处理程序设置为函数处理程序。handler 可以是一个可调用的 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 回答