有没有办法在Windows中停止time.sleep?

时间:2011-12-08 12:22:17

标签: python windows

在* nix python信令允许我在准备好之前停止睡眠。在Windows中是否有任何类似的机制 - 似乎所有方法最终只在睡眠后拦截代码?

代码示例:

from time import sleep
.. do something that will intercept the sleep
try:
    sleep(60)
finally:
    print 'how to get here under 60 seconds in windows?'

类似的问题,没有Windows的答案: break/interrupt a time.sleep() in python

2 个答案:

答案 0 :(得分:4)

signal的Python文档说:

  

•尽管Python信号处理程序是异步调用的   对于Python用户而言,它们只能发生在“原子”之间   Python解释器的说明。这意味着信号   在长期计算期间到达,纯粹用C语言实现(例如   大型文本正则表达式匹配可能会延迟   任意的时间。

time说:

  

实际的暂停时间可能比请求的少,因为任何   捕获信号将在执行后终止sleep()   信号的捕捉程序。

在Windows上,显然time.sleep()未按照文档实现,因为在睡眠的整个持续时间结束之前,睡眠期间接收到的信号的处理程序不会被执行。以下示例:

import signal, time

def handler(signum, frame):
    print('Signal handler called with signal', signum)

signal.signal(signal.SIGINT, handler)

print("signal set, sleeping")
time.sleep(10)
print("sleep done")

打印:

signal set, sleeping
Signal handler called with signal 2
sleep done

第一行立即发生,第二行发生在10秒后,无论中断何时发生。

正如Thomas K所说,更好的策略是使用线程和同步。

答案 1 :(得分:1)

我不确定这是否适合你,但这里有一点办法可以解决:

for i in range(60):
    if checkIfIShouldInterruptSleep():
         break
    time.sleep(1)
print "Finished Sleeping!"

它只对第二个准确,但它可能符合您的目的。快乐的编码!