当前位置: 首页 > 面试题库 >

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

昝光临
2023-03-14
问题内容

我正在使用以下脚本测试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+ 后,通过PID将其杀死Z,这不会被忽略。为什么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)

现在它将保留打印“ first”和“ second”,直到您按Ctrl+ 为止C

编辑:
正如评论者所指出的,守护进程线程可能没有机会清理临时文件之类的东西。如果需要,请抓住KeyboardInterrupt主线程并协调其清理和关闭。但是在很多情况下,让守护线程突然死掉可能已经足够了。



 类似资料:
  • 问题内容: 我有一个使用线程并发出大量HTTP请求的python脚本。我认为正在发生的事情是,正在读取HTTP请求(使用urllib2)时,它正在阻塞并且没有响应以停止程序。有没有办法解决? 问题答案: 在Windows上,唯一确定的方法是使用。立即停止每个python脚本! (请注意,在某些键盘上,“中断”被标记为“暂停”。)

  • 问题内容: 我知道中的命令会尽早停止脚本。 如何在Python中执行此操作? 问题答案: sys模块文档中的详细信息: 从Python退出。这是通过引发SystemExit异常来实现的,因此可以执行 try语句的finally子句指定的清除操作,并且有可能在外部级别拦截出口尝试。 可选参数arg可以是给出退出状态的整数(默认为零),也可以是其他类型的对象。如果它是整数,则shell等将零视为“成功

  • 要杀死进程,我使用Ctrl+z将程序发送到后台后,通过PID杀死它,这是不会被忽略的。为什么Ctrl+C总是被忽略?我如何解决这个问题?

  • 问题内容: 我有一个长期运行的python脚本,希望能够从另一个python脚本结束。理想情况下,我正在寻找一种将进程ID设置为第一个脚本并能够从第二个脚本通过该ID查看其是否正在运行的方法。此外,我希望能够终止该长时间运行的过程。 有没有很酷的捷径可以实现这一目标? 另外,我在Windows环境中工作。 我最近在这里找到了另一种答案:检查python脚本是否正在运行 问题答案: 您可以通过以下方

  • 我写了一个程序在IDLE令牌化文本文件,它开始令牌349文本文件!我怎样才能阻止它?如何停止正在运行的Python程序?

  • 问题内容: 我用IDLE编写了一个程序来标记文本文件,然后开始标记349个文本文件!我该如何阻止它?如何停止正在运行的Python程序? 问题答案: 要停止程序,只需按 + 。