【问题标题】:MPI signal handlingMPI 信号处理
【发布时间】:2010-11-11 20:34:47
【问题描述】:

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

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

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

如果我向生成的 Python 进程发送信号,它们可以正确处理信号;但是,发送到父 orterun 进程的信号(即来自集群上超过挂墙时间,或在终端中按 control-C)会立即杀死所有内容。

【问题讨论】:

    标签: python signals mpi


    【解决方案1】:

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

    SIGINT, SIGUSR1, SIGUSR2 将被绕过到进程。

    I_MPI_JOB_SIGNAL_PROPAGATIONI_MPI_JOB_TIMEOUT_SIGNAL可以设置发送信号。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 由于某种原因,我的 mac 上的 mpirun 无法识别此参数(即使它显示在 man 中)。 mpirun -n 2 --nw python test.py 给出错误:Failed to find the following executable: Executable: --nw,我尝试了 args 的不同排列,也尝试了 -nw。知道怎么了?谢谢。
      • Per open-mpi.org/faq/?category=osx#osx-bundled-ompi 看起来 osx 捆绑的 MPI 可能不是最好的——例如,这个看起来像一个错误。我会尝试他们的建议,例如先用open-mpi.org/software/ompi/v1.2/downloads/openmpi-1.2.4.dmg.gz 看看它是否修复了这个bug,否则用openmpi.darwinports.com 等等。
      • 感谢您的建议。但是,使用此选项似乎仍然不允许正在运行的进程接受信号;它将进程置于后台,就像我运行 program & 一样。
      • 但是现在你所说的问题(“当我按下 control-C 或当我发送 ortedrun 信号时会死”)消失了:没有 ortedrun 你可能会意外发出信号,^C 也不会伤害任何你的流程了,对吧?因此,如果您的问题是其他问题,您可能应该编辑并澄清问题。任何终端中的前台进程都不能超过 1 个,所以这不是您要的,可以吗?
      【解决方案3】:

      signal 模块支持使用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>),它将打印一条消息并继续运行。

      【讨论】:

      • 谢谢,但不幸的是,这并不能真正回答我的问题。我不想知道如何在 Python 中拦截信号;我想知道如何防止mpirun 先捕获它们,或者如何从跑步者那里传递它们(ortedortedrun)。执行mpirun -np 1 python test.py 时,当我按下 control-C 或发送 ortedrun 信号时,它仍然会死机。 (如果我确实找到了 ortedrun 产生的 Python 解释器的 pid 并发出信号,这可行;但这并不是我真正想要的。)
      猜你喜欢
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多