Zuverlässiges Verhalten von time.sleep(0.001) ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Serpens66
User
Beiträge: 259
Registriert: Montag 15. Dezember 2014, 00:31

Hallo :)

beim rumtesten ist mir gerade aufgefallen, dass zumindest bei mir auf windows 8.1 time.sleep(0.001) automatisch ausgeführt wird wie time.sleep(0.01).
Nach kurzer Recherche habe ich nur gelesen, dass die niedrigst mögliche Zeit wohl vom Betriebssystem abhängt?

Außer in kleineren Spielereien zum testen von irgendwas verwende ich glücklicherweise noch kein sleep kleiner als 0.01. Aber ich würde gerne vorsorgen und mir irgendwas besseres angewöhnen. Denn 0.01 ist doch schon ein enormer unterschied zu 0.001 oder gar kleineren Werten und da kann einiges ganz böse schief gehen. (zb in schleifen wo auf x tausend hochgezählt wird und jedesmal 0.001 sek gewartet werden soll)

Ich suche nun also:
1. Entweder eine möglichkeit dass sleep, egal wo ausgeführt, auch kleinere werte akzeptiert.
2. Oder ich will dass mir direkt eine Fehlermeldung ausgespuckt wird, dass sleep keine werte kleiner als x akzeptiert.
3. Oder ich schreib mir irgendwie hinter die Löffel, was der kleinsmögliche Wert auf allen Systemen von sleep ist und versuch es nicht zu vergessen (doch ich werds bestimmt vergessen :D)

Wie soll man zuverlässig mit sleep arbeiten, wenn je nach Betriebssystem mal 0.001 und mal 0.01 oder vllt gar 0.1 oder 1 sec gewartet wird, obwohl in jedem Fall 0.001 drin steht?
Oder hab ich was falsch verstanden?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du hast keine Garantie wann ein sleep wiederkehrt. Je nach Systemlast und anderen, wichtigeren Tasks, kann das auch Sekunden länger dauern als geplant . Und das ist halt so. Statt das irgendwie bekämpfen zu wollen musst du anders arbeiten - Miss die wirklich verflossene Zeit zb, und mach eine Tätigkeit danach davon abhängig.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Schau dir in dem Zusammenhang mal time.monotonic() als Alternative an. Dann kannst du, wie von meinem Vorposter angeregt, dein Verhalten an einen Zeitpunkt anpassen. Aber auch hier ist natürlich nicht ausgeschlossen, dass es mit anderen Aktivitäten in die Quere kommen kann.
Serpens66
User
Beiträge: 259
Registriert: Montag 15. Dezember 2014, 00:31

dankeschön :)

die Beschreibung in der Doku von monotic verstehe ich nicht.
Aktuell returned es bei mir "2103034.781" und ansteigend, also wohl eine Zahl die in sekunden hochgezählt wird.. ein unix timestamp ists nicht. Und in der Doku steht iwas von 49 Tagen. Also vllt eine art timestamp der alle 49 Tage resettet wird?
Was das nun mit sleep zu tun hat, versteh ich allerdings nicht ?
Oder meinst du ich kann das vor und nach dem sleep prüfen, um zu sehen, wie lange der sleep tatsächlich gebraucht hat? time.time() zu vergleichen geht nicht?

wie dem auch sei, es scheint keine echte Lösung zu geben, sondern man sollte stattdessen offenbar auf sowas wie sleep(0.001) verzichten.

Aktuell verwende ich es auch nicht in richtigen Skripten, nur um eine kurze bearbeitungszeit zu simulieren hätte ichs halt gern verwendet. Also zb im zusammenhang mit multiprossecing wollte ich testen wie exakt es ist, wenn ich im 0.001 oder 0.0001 sekundentakt xtausend mal etwas in eine queue packe. Stattdessen hab ich das sleep nun einfach weggelassen und die gesamtanzahl erhöht, sodass die gesamtlaufzeit hoch genug ist, um dazwischen mal auf die queue zuzugreifen.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Na, du merkst dir die Startzeit und ziehst diese von der aktuellen Zeit ab, um zu sehen wie lange etwas gebraucht hat:

Code: Alles auswählen

from time import monotonic

start = monotonic()
do_action()
duration = monotonic() - start
print('Der Vorgang brauchte', duration, 'Sekunden')
Aber an sich sollte man dafür besser das timeit-Modul benutzen...
Serpens66 hat geschrieben:ein unix timestamp ists nicht.
Als Timestamp solltest du es auf keinen Fall benutzen. Es ist dafür gedacht, ein Verhältnis zwischen zwei Zeitpunkten zu bestimmen, ohne dass diese Zeitpunkte sozusagen einen "absoluten" Sinn haben, d.h. sie entsprechen keinem konkreten Datum.

Der Vorteil an diesem recht abstrakten Konzept ist, dass die Zeitmessung nicht durch äußere Einflüsse wie Zeitzonen, Umstellung auf Winterzeit, Umstellung der Uhr allgemein, usw beeinflusst werden kann. Vergleichbar mit einem Blick auf die Stoppuhr statt auf die tatsächliche Uhrzeit.
Antworten