Python的sleep函数不捕获中断信号

4 投票
2 回答
2663 浏览
提问于 2025-04-16 18:48

我在主线程中无法捕捉到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 返回之前被调用。

撰写回答