我有一个偶尔挂起的功能。通常我会设置一个警报,但我在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
答案 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()