Python睡眠功能不会捕获中断信号

时间:2011-06-01 21:53:35

标签: python

我无法在主线程中捕获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 个答案:

答案 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信号处理程序。