我无法在主线程中捕获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()
答案 0 :(得分:3)
信号仅发送到一个线程。根据操作系统,只有第一个线程或第一个可用线程。
你必须实现自己的逻辑来关闭其他线程,或者让它们成为守护程序线程,这样它们就不会阻止进程退出。
答案 1 :(得分:2)
信不信由你,这将有效。
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()。这两种方法都允许在signal_safe_sleep返回之前调用Python信号处理程序。