Windows中的signal.alarm替换[Python]

时间:2009-03-13 18:40:41

标签: python alarm

我有一个偶尔挂起的功能。通常我会设置一个警报,但我在Windows中,它不可用。有没有一个简单的方法,或者我应该创建一个调用time.sleep()的线程?


结束了一个线程。唯一的技巧是使用os._exit而不是sys.exit

import os
import time
import threading

class Alarm (threading.Thread):
    def __init__ (self, timeout):
        threading.Thread.__init__ (self)
        self.timeout = timeout
        self.setDaemon (True)
    def run (self):
        time.sleep (self.timeout)
        os._exit (1)

alarm = Alarm (4)
alarm.start ()
time.sleep (2)
del alarm
print 'yup'

alarm = Alarm (4)
alarm.start ()
time.sleep (8)
del alarm
print 'nope'  # we don't make it this far

4 个答案:

答案 0 :(得分:3)

最强大的解决方案是使用子进程,然后终止该子进程。 Python2.6将.kill()添加到subprocess.Popen()。

我不认为您的线程方法可以按预期工作。删除对Thread对象的引用不会终止该线程。相反,您需要设置线程一旦唤醒就检查的属性。

答案 1 :(得分:3)

这是原始海报如何解决他自己的问题:

结束了一个线程。唯一的技巧是使用os._exit而不是sys.exit

import os
import time
import threading

class Alarm (threading.Thread):
    def __init__ (self, timeout):
        threading.Thread.__init__ (self)
        self.timeout = timeout
        self.setDaemon (True)
    def run (self):
        time.sleep (self.timeout)
        os._exit (1)

alarm = Alarm (4)
alarm.start ()
time.sleep (2)
del alarm
print 'yup'

alarm = Alarm (4)
alarm.start ()
time.sleep (8)
del alarm
print 'nope'  # we don't make it this far

答案 2 :(得分:2)

你可以 - 正如你所提到的那样 - 只需启动一个睡眠时间为几秒的新线程。

或者您可以使用Windows的多媒体计时器之一(在Python中,它位于windll.winmm中)。我相信timeSetEvent正是您所寻找的。顺便说一下,我发现了一段使用它的代码here

答案 3 :(得分:0)

我意识到这个帖子已经处于非活动状态一段时间了,但是我遇到了类似的问题,希望其他人也能发现这个问题很有用。

正如有用评论中提到的@jfs一样,标准threading模块提供了一个Timer方法,该方法对此非常有效(docs)。它只是threading.Thread的一个子类,但它使这非常简单和干净。它也可以使用继承的cancel方法取消。

import threading
delay_time = 3   # delay time in seconds
def watchdog():
  print('Watchdog expired. Exiting...')
  os._exit(1)

alarm = threading.Timer(delay_time, watchdog)
alarm.start()
my_potentially_never_ending_call()
alarm.cancel()