Я создаю несколько multiprocessing.Process
es, чтобы разделить рабочую нагрузку на разные procs. Теперь я хочу, чтобы иметь возможность закрыть всю программу, нажав Ctrl-C, но сигнал посылается только дочерним, а не родительскому процессу.Сигнал обрабатывается детьми, но не родительским процессом?
моя программа выглядит следующим образом:
import sys
import multiprocessing
import signal
# ignoring handler, signal.SIG_IGN is not working on windows
def sighandler(signal, frame):
pass
# worker thread definiton
def worker():
signal.signal(signal.SIGINT, sighandler)
signal.signal(signal.SIGTERM, sighandler)
# do stuff here...
def main():
num_procs = 4
procs = []
print("Starting up %d processes:" %num_procs)
for i in range(num_procs):
print("\tstarting worker %d..." %(i+1))
p = multiprocessing.Process(target=worker)
procs.append(p)
p.start()
print("All processes started...")
try:
for p in procs:
p.join()
except KeyboardInterrupt as e:
print "STOPPING"
for p in procs:
p.terminate()
sys.exit(0)
но только sighandler называется 4 раза, если я нажмите Ctrl-C. когда я регистрирую сигналы в родительском процессе, обработчик не вызывается и не работает исключение KeyboardInterrupt. Могу ли я остановить детский процесс изнутри? a sys.exit(0)
внутри обработчика не работает для меня.
хорошо, что интересно, если я это сделать в обработчике сигнала, даже 'KeyboardInterrupt' обрабатывается отлично ... – reox