代码之家  ›  专栏  ›  技术社区  ›  Seth Johnson

MPI信号处理

  •  4
  • Seth Johnson  · 技术社区  · 16 年前

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

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

    有人有什么建议吗?甚至发现如何在C或C++编译程序中捕获信号将是一个有益的开始。

    如果我向派生的python进程发送一个信号,它们可以正确地处理这些信号;但是,发送到父进程的信号 orterun 进程(即在集群上超过墙时间,或在终端中按下control-c)将立即杀死所有内容。

    3 回复  |  直到 7 年前
        1
  •  1
  •   Alex Martelli    16 年前

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

        2
  •  1
  •   CatDog    7 年前

    我认为它确实依赖于实现。

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

    I_MPI_JOB_SIGNAL_PROPAGATION I_MPI_JOB_TIMEOUT_SIGNAL 可设置为发送信号。

    另一件值得注意的事情是:对于许多python脚本,它们将通过cython调用其他库或代码,如果 SIGUSR1 如果被子进程捕获,可能会发生不需要的事情。

        3
  •  -1
  •   Torsten Marek    16 年前

    这个 signal 模块支持使用 signal.signal :

    将signal signalnum的处理程序设置为函数处理程序。处理程序可以是带两个参数(见下文)的可调用python对象,也可以是特殊值sign.sig_ign或sign.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> ,它将打印一条消息并继续运行。

    推荐文章