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

3448voto

Evan Fosmark Punkte 93825
import time
time.sleep(5)   # Delays for 5 seconds. You can also use a float value.

Hier ist ein weiteres Beispiel, bei dem etwas etwa einmal pro Minute ausgeführt wird:

import time
while True:
    print("This prints once a minute.")
    time.sleep(60) # Delay for 1 minute (60 seconds).

43 Stimmen

Wenn Sie einige Bedingungen erfüllen müssen. Es ist besser, threading.Event.wait zu verwenden.

23 Stimmen

Nun... es wird weniger häufig gedruckt, weil es Zeit braucht, um zu drucken und alle Puffer zu behandeln, die das mit sich bringt (möglicherweise ein Kernel-Kontextwechsel), und um das Alarmsignal zu registrieren, aber... ja. Ein bisschen weniger als einmal pro Minute.

24 Stimmen

Bei der Verwendung von tkinter als grafische Benutzeroberfläche wird sleep() die Aufgabe nicht erfüllen - verwenden Sie stattdessen after(): tkinter.Tk.after(yourrootwindow,60000) o yourrootwindow.after(60000)

869voto

pobk Punkte 9267

Sie können die sleep() Funktion in der time Modul . Sie kann ein Float-Argument für eine Auflösung im Sekundenbereich annehmen.

from time import sleep
sleep(0.1) # Time in seconds

3 Stimmen

Wie sieht es mit der zeitlichen Auflösung aus? Besteht z. B. die Gefahr, dass sie ein Vielfaches von 16,66 ms ist (obwohl sie im Beispiel genau 0,1 Sekunde beträgt, also 6 Vielfache von 16,66 ms)? Oder ist z. B. mindestens 1 ms garantiert? Könnte zum Beispiel eine angegebene Verzögerung von 3 ms tatsächlich zu einer Verzögerung von 17 ms führen?

112voto

Wie kann ich in Python eine Zeitverzögerung erzeugen?

In einem einzigen Thread schlage ich die Schlaffunktion :

>>> from time import sleep

>>> sleep(4)

Diese Funktion unterbricht die Verarbeitung des Threads, in dem sie vom Betriebssystem aufgerufen wird, so dass andere Threads und Prozesse ausgeführt werden können, während sie schläft.

Verwenden Sie sie zu diesem Zweck oder einfach, um die Ausführung einer Funktion zu verzögern. Zum Beispiel:

>>> def party_time():
...     print('hooray!')
...
>>> sleep(3); party_time()
hooray!

"Hurra!" wird 3 Sekunden nach dem Drücken von Enter .

Beispiel mit sleep mit mehreren Threads und Prozessen

Nochmals, sleep unterbricht Ihren Thread - er verbraucht so gut wie keine Rechenleistung.

Zur Veranschaulichung erstellen Sie ein Skript wie dieses (ich habe dies zunächst in einer interaktiven Python 3.5-Shell versucht, aber die Unterprozesse können die party_later Funktion aus irgendeinem Grund):

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor, as_completed
from time import sleep, time

def party_later(kind='', n=''):
    sleep(3)
    return kind + n + ' party time!: ' + __name__

def main():
    with ProcessPoolExecutor() as proc_executor:
        with ThreadPoolExecutor() as thread_executor:
            start_time = time()
            proc_future1 = proc_executor.submit(party_later, kind='proc', n='1')
            proc_future2 = proc_executor.submit(party_later, kind='proc', n='2')
            thread_future1 = thread_executor.submit(party_later, kind='thread', n='1')
            thread_future2 = thread_executor.submit(party_later, kind='thread', n='2')
            for f in as_completed([
              proc_future1, proc_future2, thread_future1, thread_future2,]):
                print(f.result())
            end_time = time()
    print('total time to execute four 3-sec functions:', end_time - start_time)

if __name__ == '__main__':
    main()

Beispielhafte Ausgabe dieses Skripts:

thread1 party time!: __main__
thread2 party time!: __main__
proc1 party time!: __mp_main__
proc2 party time!: __mp_main__
total time to execute four 3-sec functions: 3.4519670009613037

Multithreading

Sie können eine Funktion, die zu einem späteren Zeitpunkt in einem separaten Thread aufgerufen werden soll, mit der Option Timer Einfädeln Objekt:

>>> from threading import Timer
>>> t = Timer(3, party_time, args=None, kwargs=None)
>>> t.start()
>>>
>>> hooray!

>>>

Die leere Zeile veranschaulicht, dass die Funktion auf meine Standardausgabe gedruckt hat, und ich musste auf Enter um sicherzustellen, dass ich eine Eingabeaufforderung erhalten habe.

Der Vorteil dieser Methode ist, dass die Timer Thread wartete, konnte ich andere Dinge tun, in diesem Fall das Drücken von Enter einmal - bevor die Funktion ausgeführt wird (siehe die erste leere Eingabeaufforderung).

Es gibt kein entsprechendes Objekt in der Multiprozessor-Bibliothek . Sie können einen erstellen, aber er existiert wahrscheinlich aus einem bestimmten Grund nicht. Ein Sub-Thread macht für einen einfachen Timer viel mehr Sinn als ein ganz neuer Subprozess.

84voto

Humble_boy Punkte 1269

Verzögerungen können auch mit den folgenden Methoden realisiert werden.

Die erste Methode:

import time
time.sleep(5) # Delay for 5 seconds.

Die zweite Methode zur Verzögerung wäre die Verwendung der impliziten Wartezeitmethode:

 driver.implicitly_wait(5)

Die dritte Methode ist nützlicher, wenn Sie warten müssen, bis eine bestimmte Aktion abgeschlossen ist oder bis ein Element gefunden wurde:

self.wait.until(EC.presence_of_element_located((By.ID, 'UserName'))

21 Stimmen

Die zweite und dritte Methode sind nicht Python per se, sondern Selenium-bezogen. Und Sie würden sie verwenden, wenn Sie E2E-Tests durchführen. OP hat nicht über eine von ihnen erwähnt.

73voto

Trooper Z Punkte 1355

Es gibt fünf Methoden, die ich kenne: time.sleep() , pygame.time.wait() , matplotlib's pyplot.pause() , .after() et asyncio.sleep() .


time.sleep() Beispiel (nicht verwenden, wenn tkinter verwendet wird):

import time
print('Hello')
time.sleep(5) # Number of seconds
print('Bye')

pygame.time.wait() Beispiel (nicht empfohlen, wenn Sie nicht das Pygame-Fenster verwenden, aber Sie können das Fenster sofort schließen):

import pygame
# If you are going to use the time module
# don't do "from pygame import *"
pygame.init()
print('Hello')
pygame.time.wait(5000) # Milliseconds
print('Bye')

matplotlibs Funktion pyplot.pause() Beispiel (nicht empfehlenswert, wenn Sie das Diagramm nicht verwenden, aber Sie könnten das Diagramm sofort beenden):

import matplotlib
print('Hello')
matplotlib.pyplot.pause(5) # Seconds
print('Bye')

Le site .after() Methode (am besten mit Tkinter):

import tkinter as tk # Tkinter for Python 2
root = tk.Tk()
print('Hello')
def ohhi():
    print('Oh, hi!')
root.after(5000, ohhi) # Milliseconds and then a function
print('Bye')

Schließlich ist die asyncio.sleep() Methode:

import asyncio
asyncio.sleep(5)

0 Stimmen

driver.implicitly_wait() ist eine Selenium-Webdriver-Methode, die die Standardwartezeit für die Suche nach Elementen auf einer Webseite festlegt. Sie ist für die gestellte Frage völlig irrelevant.

0 Stimmen

Das ist nicht die Art und Weise asyncio.sleep Werke. Man muss await es innerhalb einer Ereignisschleife. Es handelt sich nicht um eine allgemeine Verzögerung.

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