如何在主程序结束时终止线程?

101 投票
6 回答
217043 浏览
提问于 2025-04-15 21:08

如果我有一个线程在不停地循环,有没有办法在主程序结束时终止它?比如说,当我按下 Ctrl+C 的时候?

6 个回答

34

尝试将子线程设置为守护线程。

推荐的做法:

from threading import Thread

t = Thread(target=desired_method)
t.daemon = True  # Dies when main thread (only non-daemon thread) exits.
t.start()

内联方式:

t = Thread(target=desired_method, daemon=True).start()

旧版API:

t.setDaemon(True)
t.start()

当你的主线程结束时(比如按下 Ctrl+C 组合键),其他线程也会根据上面的指令被终止。

132

如果你把你的工作线程设置为守护线程,那么当所有非守护线程(比如主线程)都结束时,这些守护线程也会自动结束。

http://docs.python.org/library/threading.html#threading.Thread.daemon

48

看看这个问题。正确的答案对如何正确结束线程有很好的解释:在Python中有没有办法杀死一个线程?

为了让线程在按下键盘中断信号(ctrl+c)时停止,你可以捕捉到“KeyboardInterrupt”这个异常,并在退出之前进行一些清理工作。像这样:

try:
    start_thread()  
except (KeyboardInterrupt, SystemExit):
    cleanup_stop_thread()
    sys.exit()

这样一来,你就可以控制程序在被突然终止时该做些什么。

你还可以使用内置的信号模块,这个模块可以让你设置信号处理器(在你的特定情况下是SIGINT信号):http://docs.python.org/library/signal.html

撰写回答