python - 无法使用 Ctrl-C 终止 Python 脚本

我正在使用以下脚本测试 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/

相关文章:

python - 将字符串转换为 Python 类对象?

python - 为什么 PyPy 没有包含在标准 Python 中?

python - 无法安装 Python 包 [SSL : TLSV1_ALERT_PROTOCOL

c - unix域套接字VS命名管道?

linux - tar.gz 和 tgz 是一回事吗?

python - 将 Pandas 函数应用于列以创建多个新列?

linux - 从 linux shell 脚本发送邮件

linux - ~/.ssh/config 文件中的 SSH 端口转发?

python - 通过urllib和python下载图片

linux - 设置 Vim 背景颜色