Обработка сигналов MPI

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

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

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

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


person Seth Johnson    schedule 17.07.2009    source источник


Ответы (3)


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

SIGINT, SIGUSR1, SIGUSR2 будет обходить процессы.

I_MPI_JOB_SIGNAL_PROPAGATION и I_MPI_JOB_TIMEOUT_SIGNAL можно настроить для отправки сигнала.

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

person CatDog    schedule 22.03.2018

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

person Alex Martelli    schedule 19.07.2009
comment
По какой-то причине этот аргумент не распознается mpirun на моем Mac (хотя он отображается в man). mpirun -n 2 --nw python test.py выдает ошибку: Failed to find the following executable: Executable: --nw, и я пробовал разные варианты аргументов и вместо этого пробовал -nw. Есть идеи, что случилось? Спасибо. - person Seth Johnson; 19.07.2009
comment
Согласно open-mpi.org/faq/?category=osx #osx-bundled-ompi похоже, что MPI в комплекте с OSX может быть не самым лучшим - например, этот выглядит как ошибка. Я бы попробовал их совет, например. с open-mpi.org /software/ompi/v1.2/downloads/openmpi-1.2.4.dmg.gz сначала посмотрите, исправляет ли он ошибку, в противном случае используйте openmpi.darwinports.com и т. д. - person Alex Martelli; 19.07.2009
comment
Спасибо за предложение. Однако похоже, что использование этой опции по-прежнему не позволяет запущенному процессу принимать сигналы; он переводит процессы в фоновый режим, как если бы я запускал program &. - person Seth Johnson; 21.07.2009
comment
Но теперь проблема, о которой вы сказали (умрет, когда я нажму Control-C или когда я отправлю сигнал ortedrun) исчезнет: нет никакого ortedrun, на который вы могли бы случайно подать сигнал, и ^C больше не повредит ни одному из ваших процессов, верно? Поэтому, если ваша проблема заключается в чем-то другом, вам, возможно, следует отредактировать и уточнить вопрос. Не более 1 процесса может быть передним планом в любом терминале, так что это не может быть то, о чем вы спрашиваете, не так ли? - person Alex Martelli; 21.07.2009

Модуль 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>), он напечатает сообщение и просто продолжит работу.

person Torsten Marek    schedule 17.07.2009
comment
Спасибо, но, к сожалению, это не совсем ответ на мой вопрос. Я не хотел знать, как перехватывать сигналы в Python; Я хотел знать, как не дать mpirun поймать их первым или как передать их бегуну (orted или ortedrun). При выполнении mpirun -np 1 python test.py он по-прежнему умирает, когда я нажимаю Control-C или когда я посылаю ortedrun сигнал. (Если я найду pid интерпретатора Python, который порождает ortedrun, и сообщу об этом, это сработает, но на самом деле это не то, что мне нужно.) - person Seth Johnson; 18.07.2009