Upper limit in Python time.sleep()?

2019-01-28 23:02发布

Is there an upper limit to how long you can specify a thread to sleep with time.sleep()? I have been having issues with sleeping my script for long periods (i.e., over 1k seconds). This issue has appeared on both Windows and Unix platforms.

6条回答
Melony?
2楼-- · 2019-01-28 23:16

Actual answer, at least for my machine: 4294967.2950000003911900999... seconds.

sleep(4294967.2950000003911901)

OverflowError: sleep length is too large

查看更多
闹够了就滚
3楼-- · 2019-01-28 23:19

The spec says:

Suspend execution for the given number of seconds. The argument may be a floating point number to indicate a more precise sleep time. The actual suspension time may be less than that requested because any caught signal will terminate the sleep() following execution of that signal’s catching routine. Also, the suspension time may be longer than requested by an arbitrary amount because of the scheduling of other activity in the system.

Nothing about a time limit here. Certainly 1K seconds isn't much and should work without problems.

查看更多
别忘想泡老子
4楼-- · 2019-01-28 23:27

I suppose the longer the time the more probable situation described in the docs:

The actual suspension time may be less than that requested because any caught signal will terminate the sleep() following execution of that signal’s catching routine. Also, the suspension time may be longer than requested by an arbitrary amount because of the scheduling of other activity in the system.

查看更多
虎瘦雄心在
5楼-- · 2019-01-28 23:29

you can prevent possible issues by putting the sleep with short delay into the loop:

def sleep(n):
    for i in xrange(n):
        time.sleep(1)
查看更多
闹够了就滚
6楼-- · 2019-01-28 23:31

According to the documentation, time.sleep accepts any non-zero number [1], as you probably know. However you are under the influence of your operating systems scheduler as well [1].

[1] http://docs.python.org/library/time.html

查看更多
甜甜的少女心
7楼-- · 2019-01-28 23:34

Others have explained why you might sleep for less than you asked for, but didn't show you how to deal with this. If you need to make sure you sleep for at least n seconds you can use code like:

from time import time, sleep
def trusty_sleep(n):
    start = time()
    while (time() - start < n):
        sleep(n - (time() - start))

This may sleep more than n but it will never return before sleeping at least n seconds.

查看更多
登录 后发表回答