如何中断Python多线程应用?

3 投票
2 回答
664 浏览
提问于 2025-04-16 06:13

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

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

来自线程文档

一个线程可以被标记为“守护线程”。这个标记的意思是,当程序中只剩下守护线程时,整个Python程序会退出。这个标记的初始值是从创建它的线程那里继承来的。你可以通过daemon属性来设置这个标记。

你可以尝试在调用start()之前设置thread.daemon = True,看看这样是否能解决你的问题。

3

跟普通的进程不一样,Python 处理信号的方式似乎不是完全异步的。也就是说,当你调用 'join()' 的时候,它会阻塞主线程,让主线程无法响应信号。我对此有点惊讶,因为在文档中没有看到任何说明说会发生这种情况。不过,解决这个问题的方法很简单。在你的主线程中,在调用线程的 'join()' 之前,添加下面这个循环:

while keep_testing:
    signal.pause()

撰写回答