Windows中的signal.alarm替换[Python]

2024-04-25 08:52:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有个函数偶尔挂起。通常我会设置一个闹钟,但我在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

Tags: importselftimeinitosdefexittimeout
3条回答

你可以——正如你所提到的那样——启动一个新的线程,它能睡眠那么多秒。

或者您可以使用Windows的一个多媒体计时器(在Python中,它在windl.winmm中)。我相信你要找的是timeSetEvent。顺便说一下,我发现了一段使用它的代码here

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

我不认为你的线程方法能像你期望的那样工作。删除对线程对象的引用不会终止线程。相反,您需要设置一个属性,该属性在线程醒来时进行检查。

原来的海报是这样解决自己的问题的:

最后只剩下一根线了。唯一的诀窍是用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

相关问题 更多 >

    热门问题