Python的sleep函数不捕获中断信号
我在主线程中无法捕捉到INT信号,能不能给我点建议,帮我解决这个问题。我希望睡眠方法能够被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 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()
2 个回答
4
信号只会发送给一个线程。具体是发送给第一个线程,或者根据操作系统的不同,发送给第一个可用的线程。
你需要自己想办法来关闭其他线程,或者把它们设置为守护线程,这样它们就不会阻止程序退出。
3
信不信由你,这个方法是有效的。
from Queue import Queue, Empty
def signal_safe_sleep(delay):
q = Queue()
try: q.get(True, delay)
except Empty: pass
另外,你可以使用 os.pipe() 创建一些文件描述符,然后在你的 signal_safe_sleep 函数中对它们使用 select.select()。这两种方法都能让 Python 的信号处理器在 signal_safe_sleep 返回之前被调用。