Как прервать многопоточное приложение python? - PullRequest
3 голосов
/ 28 октября 2010

Я пытаюсь запустить следующий код (это я немного упростил):

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, программа напечатает товар по сообщению и прервет его.Однако это не работает.В чем проблема?

Спасибо

Ответы [ 2 ]

3 голосов
/ 28 октября 2010

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

while keep_testing:
    signal.pause()
0 голосов
/ 28 октября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...