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

7 投票
2 回答
4411 浏览
提问于 2025-04-17 07:58

在*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上没有答案:如何打断Python中的time.sleep()

2 个回答

1

我不确定这个方法是否适合你,但这里有一个小技巧可以试试:

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

这个方法的精确度只到秒,但可能能满足你的需求。祝你编码愉快!

5

Python的文档中提到关于signal的内容:

• 尽管从Python用户的角度来看,信号处理程序是异步调用的,但它们只能在Python解释器的“原子”指令之间发生。这意味着在进行一些长时间的计算(比如在大文本上进行正则表达式匹配)时,如果有信号到达,可能会被延迟很长时间。

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所建议的,使用线程和同步机制会是一个更好的策略。

撰写回答