760 Stimmen

Wie bringe ich mein Programm dazu, 50 Millisekunden lang zu schlafen?

Wie bringe ich mein Python-Programm dazu, 50 Millisekunden lang zu schlafen?

1135voto

Will Boyce Punkte 11085

Utilice time.sleep()

from time import sleep
sleep(0.05)

11 Stimmen

@CsabaToth Solange Sie eine Python-Implementierung haben, die den Anforderungen Ihres Betriebssystems entspricht, ist das oben Genannte unabhängig vom Betriebssystem.

2 Stimmen

Aber wie kann sie eigentlich arbeiten? Wird die tatsächliche Zeitauflösung z. B. oft 16,66 ms (1/60 Sekunde) betragen? In diesem speziellen Fall beträgt die Schlafzeit zufällig genau 3-fache Zeitauflösung. Aber was ist mit der Rundung? Was ist, wenn 3 aufgrund von Gleitkommaoperationen eigentlich 2,9999999 ist und auf 2 abgerundet wird (tatsächliche Schlafzeit = 0,0333333 s = 33,33 ms)?

1 Stimmen

Es ist äußerst unwahrscheinlich, dass die Python-Codebasis sleep(0.05) auf 2 Systemuhrticks runden wird. Sie wird höchstwahrscheinlich 3 Ticks verlangen, weil das die richtige Antwort ist. ABER das System könnte nach 3 oder 4 oder 5 oder 100 Ticks zurückkehren. Es gibt keine Garantie dafür, dass es nach 3 Ticks zurückkehrt, wenn es mit etwas anderem beschäftigt ist, z. B. mit dem Flushen von Daten auf die Festplatte. Verwenden Sie dies auf keinen Fall, wenn das Timing kritisch ist. Sie müssten Code auf der Treiberebene schreiben, um Interrupts zu nutzen, wenn Sie supergenaue Sleep-Intervalle wollen.

119voto

ya23 Punkte 13912

Beachten Sie, dass Sie, wenn Sie sich auf die Einnahme von Schlaf genau 50 ms, das werden Sie nicht bekommen. Es wird einfach nur so sein.

48 Stimmen

Auf manchen Plattformen kann es 10 oder 15 ms länger dauern, seien Sie also gewarnt.

5 Stimmen

Handelt es sich um eine gleichbleibende Verzögerung bei einem bestimmten System?

12 Stimmen

@user391339 Erfahrungsgemäß ist es nicht konsistent. Thread-/Prozesspriorität, durchschnittliche CPU-Last, verfügbarer Speicher und eine Fülle anderer Faktoren machen alle Aufrufe ungenau. Je stärker das System ausgelastet ist, desto höher ist die Ungenauigkeit.

95voto

Dan Olson Punkte 1216

Utilice time.sleep() :

import time
time.sleep(50 / 1000)

Siehe die Python-Dokumentation: https://docs.python.org/library/time.html#time.sleep

17voto

Lucas Urban Punkte 463

Es gibt ein Modul namens "Zeit", das Ihnen helfen kann. Ich kenne zwei Möglichkeiten:

  1. sleep

    Schlaf ( Referenz ) bittet das Programm zu warten und dann den Rest des Codes auszuführen.

    Es gibt zwei Möglichkeiten, den Schlaf zu nutzen:

    import time # Import whole time module
    print("0.00 seconds")
    time.sleep(0.05) # 50 milliseconds... make sure you put time. if you import time!
    print("0.05 seconds")

    Bei der zweiten Möglichkeit wird nicht das gesamte Modul importiert, sondern nur der Schlaf.

    from time import sleep # Just the sleep function from module time
    print("0.00 sec")
    sleep(0.05) # Don't put time. this time, as it will be confused. You did
                # not import the whole module
    print("0.05 sec")
  2. Mit Zeit seit Unix-Zeit .

    Dieser Weg ist nützlich, wenn Sie eine Schleife laufen lassen wollen. Allerdings ist dieser Weg etwas komplexer.

    time_not_passed = True
    from time import time # You can import the whole module like last time. Just don't forget the time. before to signal it.
    
    init_time = time() # Or time.time() if whole module imported
    print("0.00 secs")
    while True: # Init loop
        if init_time + 0.05 <= time() and time_not_passed: # Time not passed variable is important as we want this to run once. !!! time.time() if whole module imported :O
            print("0.05 secs")
            time_not_passed = False

4 Stimmen

Es wird nicht empfohlen, Folgendes zu verwenden time.time() zur Messung der verstrichenen Zeit. Es ist besser, zu verwenden time.monotonic() die garantiert gleichmäßig ansteigen wird. Es gibt tatsächlich Fälle, in denen time() kann sich durch Sprünge ändern, z. B. wegen Schaltsekunden. time.monotonic() steht in keinem absoluten Zusammenhang mit der Linux-Epochenzeit, wird aber normalerweise beim Hochfahren des Systems auf 0 gesetzt.

4voto

Sie können dies auch mit der Funktion Timer() Funktion.

Code:

from threading import Timer

def hello():
  print("Hello")

t = Timer(0.05, hello)
t.start()  # After 0.05 seconds, "Hello" will be printed

0 Stimmen

Wie funktioniert es eigentlich für den Sekundenschlaf funktionieren? Oft haben Zeitgeber eine Zeitauflösung von 16,66 ms.

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