你可以使用time.sleep()函数来让线程休眠,但是是否有休眠时间的上限呢?我在使用该函数时遇到了问题,当休眠时间较长(比如超过1k秒)时,无论是在Windows还是Unix平台上都会出现问题。
其他人已经解释了为什么你可能睡眠时间少于你要求的时间,但是没有告诉你如何应对这种情况。如果你需要确保至少睡眠 n 秒,你可以使用以下代码:
from time import time, sleep
def trusty_sleep(n):
start = time()
while (time() - start < n):
sleep(n - (time() - start))
这可能会睡眠超过n秒,但在至少睡眠n秒后才会返回。
我认为时间越长,文档中描述的情况就越有可能发生:
实际挂起时间可能会比请求的时间少,因为任何捕获的信号都将终止
sleep()
在执行该信号的捕获例程后。此外,由于系统中其他活动的调度,挂起时间可能比请求的时间长任意数量。
对于我的计算机而言,实际答案是:4294967.2950000003911900999秒。
注:该时间已按照ISO 8601格式进行表示。sleep(4294967.2950000003911901)
OverflowError: 睡眠时间过长
4294968
确实。 - okie通过在循环中加入短延迟的睡眠,您可以避免可能出现的问题:
def sleep(n):
for i in xrange(n):
time.sleep(1)
我也遇到了一个情况,需要问自己这个问题。在我的情况下,我的线程需要长时间休眠(几天、几个月)。正如matt回答的那样,有一个限制。在他和我的系统中,限制是4.29百万秒+
,不同的系统有不同的限制,正如mats回答评论中的某人所说,Repl.it有更大的限制。
总之,我们受到了限制,但我找到了一个解决方法,就是将秒数分成块,使用max_sleep_secs
循环遍历这些块并进行休眠。
import time
def sweet_dreams(secs: float):
DEBUG = False
max_sleep_secs = 1000000
secs_extra_ms = 0
if secs > max_sleep_secs:
if type(secs) is float:
secs_extra_ms = str(secs).split('.')[-1]
if secs_extra_ms:
secs_extra_ms = secs_extra_ms.lstrip('0')
secs_extra_ms = float(f"0.{secs_extra_ms}")
secs = int(secs)
secs_divide = float(secs) / max_sleep_secs # e.g: 2.4123
secs_int = int(secs_divide) # e.g: 2
secs_decimal_remainder = int(str(secs_divide).split(".")[-1]) # e.g 4123
chunks = [max_sleep_secs for _ in range(secs_int)]
if secs_decimal_remainder:
chunks.append(int(str(secs_decimal_remainder).lstrip('0')))
if secs_extra_ms:
chunks.append(secs_extra_ms)
if DEBUG:
print(f"Debug [sweet_dreams]: -> Total: {secs} | Max: {max_sleep_secs} | Chunks: {chunks}")
quit()
for seconds in chunks:
time.sleep(seconds)
else:
if DEBUG:
print(f"Debug [sweet_dreams]: -> Total: {secs} | Max: {max_sleep_secs} | Chunks: None")
quit()
time.sleep(secs)