20

我有一个偶尔挂起的功能。

通常我会设置警报,但我在 Windows 中并且它不可用。

有没有一种简单的方法可以解决这个问题,还是我应该创建一个调用的线程time.sleep()

4

4 回答 4

3

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

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

于 2009-03-30T21:26:04.390 回答
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
于 2015-07-28T08:29:22.127 回答
2

您可以 - 正如您所提到的 - 只需启动一个休眠该秒数的新线程。

或者,您可以使用 Windows 的多媒体计时器之一(在 Python 中,在 windll.winmm 中)。我相信timeSetEvent这就是你要找的。顺便说一句,我在这里找到了一段使用它的代码。

于 2009-03-13T19:27:50.467 回答
1

我意识到这个线程已经有一段时间没有活动了,但是我遇到了类似的问题,希望其他人也能发现这很有用。

正如@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()
于 2018-03-18T02:11:37.173 回答