我有一个偶尔挂起的功能。
通常我会设置警报,但我在 Windows 中并且它不可用。
有没有一种简单的方法可以解决这个问题,还是我应该创建一个调用的线程time.sleep()
?
最强大的解决方案是使用子进程,然后终止该子进程。Python2.6 将 .kill() 添加到 subprocess.Popen()。
我不认为您的线程方法按您的预期工作。删除对 Thread 对象的引用不会终止线程。相反,您需要设置线程唤醒后检查的属性。
以下是原始海报如何解决他自己的问题:
结束了一个线程。唯一的技巧是使用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
您可以 - 正如您所提到的 - 只需启动一个休眠该秒数的新线程。
或者,您可以使用 Windows 的多媒体计时器之一(在 Python 中,在 windll.winmm 中)。我相信timeSetEvent
这就是你要找的。顺便说一句,我在这里找到了一段使用它的代码。
我意识到这个线程已经有一段时间没有活动了,但是我遇到了类似的问题,希望其他人也能发现这很有用。
正如@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()