Обработчик сигнала вызывается один раз для каждого процесса

#python #multiprocessing #signals

#python #многопроцессорная обработка #сигналы

Вопрос:

У меня есть программа, которая запускает несколько процессов, и я убиваю ее с помощью Ctrl C.

В начале программы я перехватываю сигнал, чтобы выполнить некоторые операции очистки.

 def cleanup(*_):
    # do cleanup operations here
    # ...
    exit(1)

# trap ctrl c and hide the traceback message
signal(SIGINT, cleanup)

# spawn processes (pool of workers) and do work here
# ...
  

Проблема в том, что cleanup вызывается несколько раз (один раз для каждого запущенного процесса).

Как я могу сделать так, cleanup чтобы он вызывался только один раз?

Ответ №1:

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

Комментарии:

1. Как мне отменить его регистрацию? Я предполагаю, что есть другой способ, кроме указания на обработчик пустой функции?

2. original_sigint_handler = signal.getsignal(сигнал. SIGINT) Затем, позже … signal.signal(сигнал. SIGINT, original_sigint_handler)