Python睡眠函数不捕捉中断信号
我无法捕获主线程中的INT信号,请告诉我如何解决该问题。我希望sleep方法可以被CTRL+C中断,但它会等到计时器结束Python睡眠函数不捕捉中断信号,python,Python,我无法捕获主线程中的INT信号,请告诉我如何解决该问题。我希望sleep方法可以被CTRL+C中断,但它会等到计时器结束 import pygtk pygtk.require('2.0') import gtk import time import urllib2 import re import signal import sys import __main__ from time import ctime, strftime, localtime from threading impo
import pygtk
pygtk.require('2.0')
import gtk
import time
import urllib2
import re
import signal
import sys
import __main__
from time import ctime, strftime, localtime
from threading import Thread
myThread = None
class MyThread(Thread):
def __init__(self, filename):
Thread.__init__(self)
self.filename = filename;
self.terminate = False
def StopProcess(self):
self.terminate = True
def run(self):
while self.terminate <> True:
time.sleep(5)
self.terminate = True
def SignalHandler(signum, frame):
if (myThread <> None):
myThread.StopProcess()
sys.exit()
if __name__ == "__main__":
signal.signal(signal.SIGINT, SignalHandler)
myThread = MyThread("aaa")
myThread.start()
导入pygtk
pygtk.require('2.0')
进口gtk
导入时间
导入urllib2
进口稀土
输入信号
导入系统
导入主__
从时间导入ctime、strftime、localtime
从线程导入线程
myThread=无
类MyThread(线程):
def uuu init uuu(self,文件名):
线程。\uuuu初始化\uuuuu(自)
self.filename=文件名;
self.terminate=False
def停止进程(自身):
self.terminate=True
def运行(自):
当self.terminate为True时:
时间。睡眠(5)
self.terminate=True
def信号处理器(信号,帧):
如果(读取无):
myThread.StopProcess()
sys.exit()
如果名称=“\uuuuu main\uuuuuuuu”:
signal.signal(signal.SIGINT,SignalHandler)
myThread=myThread(“aaa”)
myThread.start()
信号仅传送到一个线程。仅第一个线程或第一个可用线程,具体取决于操作系统
您必须实现自己的逻辑来关闭其他线程,或者使它们成为守护进程线程,这样它们就不会阻止进程退出。信不信由你,这将起作用
from Queue import Queue, Empty
def signal_safe_sleep(delay):
q = Queue()
try: q.get(True, delay)
except Empty: pass
或者,您可以使用os.pipe()创建一些文件描述符,然后在signal\u safe\u sleep函数中对它们使用select.select()。这两种方法都允许在signal\u safe\u sleep返回之前调用Python信号处理程序。同样,我只是用你的代码片段更改了time.sleep函数,脚本仍然不响应ctrl+c并等待5秒。对,只有当你的主线程是调用signal\u safe\u sleep的线程时,这才有效,因为主线程是获取^C的线程。在代码中,当SIGTERM出现时,主解释器线程已经在其关闭例程中(加入所有非守护进程线程)。我不确定你的SignalHandler函数在这种情况下是否被调用。是的,你是对的,主线程末尾的signal.pause()完成了它。谢谢标准行为是捕获SIGINT并将其转换为KeyboardInterrupt异常。我很好奇是否有一个原因,仅仅捕获该异常是不够的?