我正在使用以下脚本测试 Python 线程:
import threading
class FirstThread (threading.Thread):
def run (self):
while True:
print 'first'
class SecondThread (threading.Thread):
def run (self):
while True:
print 'second'
FirstThread().start()
SecondThread().start()
这是在 Kubuntu 11.10 上的 Python 2.7 中运行的。 Ctrl+C 不会杀死它。我还尝试为系统信号添加处理程序,但这没有帮助:
import signal
import sys
def signal_handler(signal, frame):
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
为了杀死进程,我在使用 Ctrl+Z 将程序发送到后台后通过 PID 杀死它,这不会被忽略。为什么 Ctrl+C 会被如此持久地忽略?我该如何解决这个问题?
最佳答案
Ctrl+C 会终止主线程,但是由于您的线程未处于守护程序模式,它们会继续运行,从而使进程保持事件状态。我们可以让它们成为守护进程:
f = FirstThread()
f.daemon = True
f.start()
s = SecondThread()
s.daemon = True
s.start()
但是还有另一个问题——一旦主线程启动了你的线程,它就没有其他事情要做了。所以它退出了,线程立即被销毁。所以让我们保持主线程活着:
import time
while True:
time.sleep(1)
现在它将保持打印“第一”和“第二”,直到您点击 Ctrl+C。
编辑:正如评论者所指出的,守护线程可能没有机会清理诸如临时文件之类的东西。如果需要,请在主线程上捕获 KeyboardInterrupt
并让它协调清理和关闭。但在很多情况下,让守护线程突然死掉可能就足够了。
https://stackoverflow.com/questions/11815947/