3202 Stimmen

Wie kann ich eine Zeitverzögerung erzeugen?

Ich würde gerne wissen, wie man eine Zeitverzögerung in ein Python-Skript einfügt.

14 Stimmen

55voto

Jan Vlcinsky Punkte 40541

Ein bisschen Spaß mit einem verschlafenen Generator .

Die Frage bezieht sich auf die Zeitverzögerung. Es kann eine feste Zeit sein, aber in einigen Fällen brauchen wir vielleicht eine Verzögerung, die seit dem letzten Mal gemessen wird. Hier ist eine mögliche Lösung:

Verzögerung seit dem letzten Mal gemessen (regelmäßiges Aufwachen)

Die Situation kann so aussehen, dass wir etwas so regelmäßig wie möglich machen wollen und uns nicht mit den ganzen last_time , next_time Sachen rund um unseren Code.

Buzzer-Generator

Der folgende Code ( schläfrig.py ) definiert eine buzzergen Generator:

import time
from itertools import count

def buzzergen(period):
    nexttime = time.time() + period
    for i in count():
        now = time.time()
        tosleep = nexttime - now
        if tosleep > 0:
            time.sleep(tosleep)
            nexttime += period
        else:
            nexttime = now + period
        yield i, nexttime

Aufrufen von regulären Buzzergen

from sleepy import buzzergen
import time
buzzer = buzzergen(3) # Planning to wake up each 3 seconds
print time.time()
buzzer.next()
print time.time()
time.sleep(2)
buzzer.next()
print time.time()
time.sleep(5) # Sleeping a bit longer than usually
buzzer.next()
print time.time()
buzzer.next()
print time.time()

Und wir sehen, wie es läuft:

1400102636.46
1400102639.46
1400102642.46
1400102647.47
1400102650.47

Wir können sie auch direkt in einer Schleife verwenden:

import random
for ring in buzzergen(3):
    print "now", time.time()
    print "ring", ring
    time.sleep(random.choice([0, 2, 4, 6]))

Und wenn wir sie laufen lassen, werden wir sehen:

now 1400102751.46
ring (0, 1400102754.461676)
now 1400102754.46
ring (1, 1400102757.461676)
now 1400102757.46
ring (2, 1400102760.461676)
now 1400102760.46
ring (3, 1400102763.461676)
now 1400102766.47
ring (4, 1400102769.47115)
now 1400102769.47
ring (5, 1400102772.47115)
now 1400102772.47
ring (6, 1400102775.47115)
now 1400102775.47
ring (7, 1400102778.47115)

Wie wir sehen, ist dieser Buzzer nicht zu starr und ermöglicht es uns, regelmäßige Schlafintervalle einzuhalten, selbst wenn wir verschlafen und aus dem regelmäßigen Zeitplan geraten.

35voto

Parallax Sugar Punkte 675

Le site Tkinter Bibliothek in der Python-Standardbibliothek ist ein interaktives Werkzeug, das Sie importieren können. Im Grunde kann man damit Schaltflächen, Boxen, Popups und andere Dinge erstellen, die als Fenster erscheinen und die man mit Code manipulieren kann.

Wenn Sie Tkinter verwenden, nicht verwenden time.sleep() denn das würde Ihr Programm durcheinander bringen. Das ist mir passiert. Verwenden Sie stattdessen root.after() und ersetzen Sie die Werte für wie viele Sekunden auch immer, durch Millisekunden. Zum Beispiel, time.sleep(1) ist gleichbedeutend mit root.after(1000) in Tkinter.

Ansonsten, time.sleep() Das ist der richtige Weg, wie viele Antworten gezeigt haben.

27voto

Matthew Miles Punkte 640

Verzögerungen werden mit dem Zeitbibliothek insbesondere die time.sleep() Funktion.

Einfach eine Sekunde warten lassen:

from time import sleep
sleep(1)

Das funktioniert, weil wir es tun:

from time import sleep

Sie extrahieren die Schlaffunktion nur von der Zeitbibliothek was bedeutet, dass Sie es einfach mit aufrufen können:

sleep(seconds)

Anstatt abtippen zu müssen

time.sleep()

Das ist unangenehm lang zu tippen.

Mit dieser Methode haben Sie keinen Zugang zu den anderen Funktionen der Zeitbibliothek und Sie können keine Variable namens sleep . Sie könnten jedoch eine Variable mit dem Namen time .

Tun from [library] import [function] (, [function2]) ist ideal, wenn Sie nur bestimmte Teile eines Moduls benötigen.

Man könnte es auch so machen:

import time
time.sleep(1)

und Sie hätten Zugang zu den anderen Funktionen des Zeitbibliothek como time.clock() so lange Sie time.[function]() aber Sie konnten die Variable time nicht erstellen, weil sie den Import überschreiben würde. Eine Lösung für dieses Problem ist

import time as t

was es Ihnen ermöglichen würde, auf die Zeitbibliothek como t und ermöglicht es Ihnen zu tun:

t.sleep()

Dies funktioniert mit jeder Bibliothek.

8 Stimmen

Dies ist im Grunde ein Mini-Tutorial über Importe, nach denen der Auftraggeber nie gefragt hat. Diese Antwort könnte ersetzt werden durch "use time.sleep() "

16voto

BlackBeard Punkte 9394

Wenn Sie eine Zeitverzögerung in ein Python-Skript einbauen möchten:

Verwenden Sie time.sleep ou Event().wait así:

from threading import Event
from time import sleep

delay_in_sec = 2

# Use time.sleep like this
sleep(delay_in_sec)         # Returns None
print(f'slept for {delay_in_sec} seconds')

# Or use Event().wait like this
Event().wait(delay_in_sec)  # Returns False
print(f'waited for {delay_in_sec} seconds')

Wenn Sie jedoch die Ausführung einer Funktion verzögern wollen, tun Sie dies:

Verwenden Sie threading.Timer así:

from threading import Timer

delay_in_sec = 2

def hello(delay_in_sec):
    print(f'function called after {delay_in_sec} seconds')

t = Timer(delay_in_sec, hello, [delay_in_sec])  # Hello function will be called 2 seconds later with [delay_in_sec] as the *args parameter
t.start()  # Returns None
print("Started")

Ausgänge:

Started
function called after 2 seconds

Warum sollte man den letzteren Ansatz wählen?

  • Das tut sie no stoppt die Ausführung des gesamten Skripts (mit Ausnahme der Funktion, die Sie übergeben).
  • Nachdem Sie den Timer gestartet haben, können Sie ihn auch stoppen, indem Sie timer_obj.cancel() .

0 Stimmen

Es funktioniert beim ersten Mal. Beim zweiten Mal wird der Fehler "RuntimeError: Threads können nur einmal gestartet werden" ausgegeben.

12voto

Aaron_ab Punkte 3066

Asyncio.sleep

Beachten Sie, dass Sie in neueren Python-Versionen (Python 3.4 oder höher) die Funktion asyncio.sleep . Es geht um asynchrone Programmierung und Asyncio. Sehen Sie sich das nächste Beispiel an:

import asyncio
from datetime import datetime

@asyncio.coroutine
def countdown(iteration_name, countdown_sec):
    """
    Just count for some countdown_sec seconds and do nothing else
    """
    while countdown_sec > 0:
       print(f'{iteration_name} iterates: {countdown_sec} seconds')
       yield from asyncio.sleep(1)
       countdown_sec -= 1

loop = asyncio.get_event_loop()
tasks = [asyncio.ensure_future(countdown('First Count', 2)),
         asyncio.ensure_future(countdown('Second Count', 3))]

start_time = datetime.utcnow()

# Run both methods. How much time will both run...?
loop.run_until_complete(asyncio.wait(tasks))

loop.close()

print(f'total running time: {datetime.utcnow() - start_time}')

Man könnte meinen, dass die erste Methode 2 Sekunden lang "schläft" und die zweite Methode 3 Sekunden, also insgesamt 5 Sekunden Laufzeit. Aber es wird gedruckt:

total_running_time: 0:00:03.01286

Es wird empfohlen zu lesen offizielle asyncio-Dokumentation für weitere Einzelheiten.

0 Stimmen

Warum ist dies besser als time.sleep()?

0 Stimmen

Versuchen Sie ein ähnliches Beispiel mit time.sleep . Sie werden nicht die gleichen Ergebnisse bei der Laufzeit erhalten. Empfehlen Sie zu lesen über asynchronous programmieren in python

6 Stimmen

Die ursprüngliche Frage bezog sich auf das Einfügen einer Verzögerung. Dieser Nagel braucht einen Hammer, keinen asynchronen Schraubenschlüssel :-)

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