不能用Ctrl-C杀死Python脚本

我正在用以下脚本testingPython线程:

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 ,并协调清理和closures。 但是在很多情况下,让守护进程突然死亡可能就足够了。

KeyboardInterrupt和信号只能看到进程(即主线程)…看看Ctrl-C ie KeyboardInterrupt杀死python中的线程