如何中断python多线程应用程序?

时间:2010-10-28 10:53:57

标签: python multithreading signals

我正在尝试运行以下代码(我简化了一下):

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 个答案:

答案 0 :(得分:3)

与常规进程不同,Python似乎不会以真正的异步方式处理信号。 'join()'调用以某种方式阻止主线程阻止它响应信号。我对此感到有些惊讶,因为我在文档中没有看到任何表明这可能/应该发生的事情。然而,解决方案很简单。在主线程中,在线程上调用'join()'之前添加以下循环:

while keep_testing:
    signal.pause()

答案 1 :(得分:0)

来自threading docs

  

线程可以标记为“守护程序线程”。这个标志的意义在于,当只剩下守护进程线程时,整个Python程序都会退出。初始值继承自创建线程。可以通过守护程序属性设置标志。

您可以在致电thread.daemon = True之前尝试设置start(),看看是否能解决您的问题。