2016-11-08 1 views
-4

Ich mache eine digitale Uhr in Python für Minecraft Pi-Ausgabe. Ich benutze eine einzelne while-Schleife, die viel Code enthält - es dauert eine kurze Zeit, um einen Durchlauf davon auszuführen, aber es sind ein paar Millisekunden mehr als ich will, und das ist verheerend auf meiner Uhr. Gibt es eine Möglichkeit, eine While-Schleife vollständig genau zu machen? Ich verwende zwei Werte von time.sleep(1), aber es dauert länger als zwei Sekunden, um ausgeführt zu werden.Wie man While-Loops braucht eine bestimmte Zeit nehmen

Beispiel:

while True: 
    start = time.time() 
    for _ in range(5): 
     1000**3 
    time.sleep(1) 
    print (time.time() - start) 

, die mehr als 1 Sekunde pro Schleife dauert.

1.00102806091 
1.00028204918 
1.00103116035 
1.00051879883 
1.0010240078 
1.00102782249 

Dieser Fehler sammelt sich im Laufe der Zeit. Wie kann ich verhindern, dass es driftet?

+1

Jede Wiederholung Ihrer Schleife dauert 2 Sekunden (nach 'time.sleep()') + die Zeit, die Ihr Code in der while zur Ausführung benötigt. 'time.sleep (n)' stoppt die Ausführung Ihres Codes mit 'n' Sekunden –

+0

Wie kommt es, dass es so viel negatives Feedback gibt? Was mache ich falsch? –

+1

Nun @I.Scott eine Sache, die ich sehe, ist, dass Sie keinen Code in Ihre Frage gestellt haben. Brauchen Sie immer Code in einer Frage? Nein überhaupt nicht. Aber in Ihrem Fall kann der Ausschluss von Code aus Ihrer Frage die Nachricht senden, dass jemand Code für Sie schreiben soll, welcher _way_ off-topic hier ist. Wenn Sie etwas Code haben, schlage ich vor, Ihre Frage hinzuzufügen, um zu zeigen, dass Sie zumindest versucht haben, Ihr Problem zu lösen. –

Antwort

6

Sie können Zeitsynchronisationscode (von einem Server Monitor getroffen, um diese Probe ich habe) schreiben:

# sync time so that it runs every two minutes, in 20 minute cycles (:00, :20, :40) 
    time.sleep(1200 - (time.time() % 1200)) 
    while True: 
     # Do stuff 
     time.sleep(120 - (time.time() % 120)) 

Wenn Sie etwas alle zwei Sekunden laufen:

time.sleep(2 - (time.time() % 2)) 

wird es Schlaf machen bis zur nächsten geraden Sekunde, dann lauf. Dies funktioniert, es sei denn die Zeit bis Do stuff überschreitet einen Zyklus. Es wird dann einen Takt überspringen.

Für eine Uhr, Ausgabe:

>>> for _ in range(5): 
...  time.sleep(1 - (time.time() % 1)) 
...  print time.time() 
1478641441.0 
1478641442.0 
1478641443.0 
1478641444.0 
1478641445.0 

Das funktioniert, weil time.time() % 1 nur den Bruchteil einer Sekunde von der aktuellen Zeit gibt: 0.37 zum Beispiel. Wenn ich sage time.sleep(1 - 0.37) es schläft für 0.63 Sekunden, die die verbleibende Zeit bis zur nächsten Runde Sekunde ist.

Wenn das nächste Mal 0.55 Sekunden dauert, um meinen Code auszuführen, wird die verbleibende 0.45 automatisch schlafen.

+0

Können Sie erklären, wie 'time.sleep (1 - (time.time()% 1))' funktioniert? Ich verstehe nichts davon, wirklich –

+0

@ I.Scott Ich habe meine Antwort aktualisiert, um eine kurze Erklärung zu enthalten. – TemporalWolf

Verwandte Themen