Обработка сигналов MPI - PullRequest
5 голосов
/ 18 июля 2009

При использовании mpirun возможно ли перехватывать сигналы (например, SIGINT, сгенерированный ^C) в выполняемом коде?

Например, я запускаю параллельный код Python. Я могу except KeyboardInterrupt перехватить эти ошибки при запуске python blah.py, но не могу при mpirun -np 1 python blah.py.

У кого-нибудь есть предложения? Даже поиск того, как отлавливать сигналы в скомпилированной программе на C или C ++, был бы полезным началом.

Если я отправлю сигнал порожденным процессам Python, они смогут правильно обработать сигналы; однако сигналы, отправленные в родительский процесс orterun (т. е. из-за превышения времени ожидания в кластере или нажатия клавиши control-C в терминале), немедленно уничтожат все.

Ответы [ 3 ]

2 голосов
/ 22 марта 2018

Я думаю, что это действительно зависит от реализации.

SIGINT, SIGUSR1, SIGUSR2 будет обойдено процессами.

I_MPI_JOB_SIGNAL_PROPAGATION и I_MPI_JOB_TIMEOUT_SIGNAL могут быть установлены для отправки сигнала.

Еще одна вещь, на которую стоит обратить внимание: для многих скриптов на python они будут вызывать другие библиотеки или коды через cython, и, если подпроцесс поймает SIGUSR1, может произойти что-то нежелательное.

1 голос
/ 19 июля 2009

Если вы используете mpirun --nw, то mpirun сам должен завершить работу, как только он запускает подпроцессы, вместо того, чтобы ждать их завершения; если это приемлемо, то я полагаю, что ваши процессы смогут перехватывать свои собственные сигналы.

0 голосов
/ 18 июля 2009

Модуль signal поддерживает настройку обработчиков сигналов с использованием signal.signal:

Установите обработчик для сигнала signalnum на обработчик функций. Обработчик может быть вызываемым объектом 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>), он напечатает сообщение и просто продолжит работу.

...