9 Stimmen

Obergrenze in Python time.sleep()?

Gibt es eine Obergrenze dafür, wie lange man einen Thread mit time.sleep() schlafen lassen kann? Ich habe Probleme mit Schlaf mein Skript für lange Zeiträume (d.h., über 1k Sekunden). Dieses Problem ist sowohl auf Windows- als auch auf Unix-Plattformen aufgetreten.

0 Stimmen

Meine Vermutung ist, dass es plattformspezifisch ist, aber ich habe nicht genug Wissen, um etwas zu beweisen.

4 Stimmen

Ja, es gibt eine Obergrenze: Wenn jemand über das Stromkabel Ihrer Maschine stolpert ;-)

4 Stimmen

Welches "Problem" haben Sie? Seien Sie konkret.

12voto

samtregar Punkte 6566

Andere haben zwar erklärt, warum Sie vielleicht weniger schlafen, als Sie wollten, aber sie haben Ihnen nicht gezeigt, wie Sie damit umgehen können. Wenn Sie sicherstellen müssen, dass Sie mindestens n Sekunden schlafen, können Sie einen Code wie diesen verwenden:

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

Es kann mehr als n Sekunden schlafen, aber es kehrt nie zurück, bevor es nicht mindestens n Sekunden geschlafen hat.

1 Stimmen

+1 dafür, dass Sie nicht denselben Fehler begehen wie @mykhal, bei dem die kumulative Wirkung des Schlafs in kleinen Schritten zu einer deutlich höheren Gesamtschlafdauer führt als gewünscht.

8voto

SilentGhost Punkte 285785

Ich nehme an, je länger die Zeit, desto wahrscheinlicher die in den Dokumenten beschriebene Situation :

Die tatsächliche Aussetzungszeit kann kürzer sein als die beantragte, da jedes aufgefangene Signal die Aussetzung beendet. sleep() nach der Ausführung der Abfangroutine für dieses Signal. Außerdem kann die Aussetzungszeit aufgrund der Planung anderer Aktivitäten im System um einen beliebigen Betrag länger sein als gefordert.

0 Stimmen

Das Wunder von Copy&Paste... (siehe Antwort von eliben). Aber +1 für die Angabe der Quelle mit Link.

0 Stimmen

@Boldewyn: nur weil mein firefox eingefroren ist, war ich 3 Sekunden später als Eli.

0 Stimmen

@Boldewyn: Wir bieten jedoch unterschiedliche Bewertungen an.

7voto

Mat Punkte 81

Dies wurde in Version 3.5 geändert :

time.sleep(*secs*): Die Funktion schläft jetzt al menos secs auch wenn die Schlaf durch ein Signal unterbrochen wird, es sei denn, der Signalhandler löst eine Ausnahme auslöst (siehe PEP 475 für die Begründung)

5voto

Matt Punkte 89

Tatsächliche Antwort, zumindest für meine Maschine: 4294967.2950000003911900999... seconds.

sleep(4294967.2950000003911901)

OverflowError: Länge des Schlafs ist zu groß

11 Stimmen

Woher haben Sie diese Zahl?

0 Stimmen

Sie sind ein Rätsel, Sir

0 Stimmen

@Matt Interessant!

1voto

zpon Punkte 1406

Der Dokumentation zufolge akzeptiert time.sleep jede Zahl ungleich Null [1], wie Sie wahrscheinlich wissen. Allerdings stehen Sie auch unter dem Einfluss des Schedulers Ihres Betriebssystems [1].

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

0 Stimmen

Entschuldigung, ich habe die anderen Antworten nicht gesehen, bevor ich gepostet habe.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X