2014-01-14 2 views
0

Я создаю несколько 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) внутри обработчика не работает для меня.

ответ

0

Вы пытались использовать os._exit(n)?

Из документов:

Выход процесса со статусом п, без вызова обработчиков очистки, промывки STDIO буферов и т.д.

Наличие: Unix, Windows.

Примечание. Стандартный способ выхода - sys.exit (n). _exit() обычно должен использоваться только в дочернем процессе после fork().

http://docs.python.org/2/library/os.html#os._exit

+1

хорошо, что интересно, если я это сделать в обработчике сигнала, даже 'KeyboardInterrupt' обрабатывается отлично ... – reox

Смежные вопросы