2010-10-28 3 views
3

Я пытаюсь выполнить следующий код (это я немного упрощен):Как прервать многопоточное приложение python?

def RunTests(self): 
     from threading import Thread 
     import signal 

     global keep_running 
     keep_running = True 
     signal.signal(signal.SIGINT, stop_running) 

     for i in range(0, NumThreads): 
      thread = Thread(target = foo) 
      self._threads.append(thread) 
      thread.start() 

# wait for all threads to finish 
     for t in self._threads: 
      t.join() 

def stop_running(signl, frme): 
    global keep_testing 
    keep_testing = False 
    print "Interrupted by the Master. Good by!" 
    return 0 

def foo(self): 

    global keep_testing 

    while keep_testing: 
     DO_SOME_WORK(); 

Я ожидаю, что пользователь нажимает Ctrl + C программы напечатает хорошо сообщение и прерывает. Однако это не сработает. В чем проблема?

Благодаря

ответ

3

В отличие от обычных процессов, Python, похоже, не обрабатывает сигналы по-настоящему асинхронно. Вызов «join()» каким-то образом блокирует основной поток таким образом, чтобы он не реагировал на сигнал. Я немного удивлен этим, так как я не вижу ничего в документации, указывающей, что это может/должно произойти. Решение, однако, прост. В основной теме добавьте следующий цикл до вызова «join()» в потоках:

while keep_testing: 
    signal.pause() 
+1

Большое спасибо. Я потратил много времени на решение этой проблемы. –

0

От threading docs:

Нить может быть помечен как «демон нить». Значение этого флага заключается в том, что вся программа Python завершается, когда остаются только потоки демона. Начальное значение наследуется от создающего потока. Флаг может быть установлен через свойство daemon.

Вы можете попробовать установить thread.daemon = True перед вызовом start() и посмотреть, если это решит вашу проблему.

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