在* 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
答案 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!"
它只对第二个准确,但它可能符合您的目的。快乐的编码!