2009-12-21 3 views
2

Есть ли верхний предел того, как долго вы можете указать поток для сна с time.sleep()? У меня были проблемы со спящим сценарием в течение длительных периодов времени (то есть более 1 секунды). Эта проблема появилась на платформах Windows и Unix.Верхний предел в Python time.sleep()?

+2

Да, есть верхний предел: Когда кто-то спотыкается кабель питания вашей машины ;-) – Boldewyn

+4

Что «вопрос» вы с? Быть конкретной. –

+0

Я предполагаю, что это определенная платформа, но у меня недостаточно знаний, чтобы пробовать что-либо. – Boldewyn

ответ

5

Я полагаю, тем дольше время более вероятным 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.

+0

Чудо копировать и вставлять ... (см. Ответ eliben). Однако +1 для включения источника со ссылкой. – Boldewyn

+0

@Boldewyn: только потому, что мой firefox застыл, я был через 3 секунды позже eli. – SilentGhost

+0

@Boldewyn: мы действительно предоставляем различные оценки. – SilentGhost

1

Спецификация говорит:

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.

Ничто срока здесь. Конечно, 1 тыс. Секунд не так много и должно работать без проблем.

1

Согласно документации, time.sleep принимает любое ненулевое число [1], как вы, наверное, знаете. Однако вы также находитесь под влиянием планировщика своих операционных систем [1].

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

+0

Простите, не видели другие ответы перед публикацией. – zpon

1

вы можете предотвратить возможные проблемы, поставив сон с короткой задержкой в ​​петлю:

def sleep(n): 
    for i in xrange(n): 
     time.sleep(1) 
+0

Это немного лучше, но он все равно может спать меньше, чем n, если вызовы sleep() прерываются раньше. – samtregar

+1

ну, в этом случае i меняет функцию на: t0 = time.time(); while time.time() mykhal

7

Другие объяснили, почему Вы могли бы спать меньше, чем вы просили, но не показал вам, как с этим бороться. Если вам нужно, чтобы убедиться, что вы спите, по крайней мере, п секунд вы можете использовать такой код:

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

Это может спать больше, чем п, но он никогда не будет возвращаться перед сном, по крайней мере, п секунд.

+0

+1 для того, чтобы не сделать ту же ошибку @mykhal, где кумулятивный эффект сна с небольшими приращениями будет нарастать, чтобы привести к значительно большему полному сну, чем хотелось бы , –

-1

Фактический ответ, по крайней мере для моей машины: 4294967.2950000003911900999 ... секунд.

sleep(4294967.2950000003911901) 

OverflowError: длина сна слишком большой

+1

Как вы получили этот номер? – SherylHohman

Смежные вопросы