So etwas wie JS setTimeout in Python

Ich habe einige mit dem Thema versucht.

Synchrone Verarbeitung

In erster Linie können Sie die angegebene Zeitverarbeitung verzögern, indem Sie "time.sleep" wie folgt verwenden.

import time
def hello(target):
    print("Hello {}".format(target))

time.sleep(3)
hello("World")

Dies verzögert jedoch alles nach "time.sleep". Wie kann ich einen bestimmten Prozess wie setTimeout verzögern?

Asynchrone Verarbeitung (Thread)

Sie können dies mit threading.Timer tun.

from threading import Timer

def hello(target):
    print("Hello {}".format(target))
    
timer = Timer(3, hello, ("World", ))
timer.start()

Sie können auch in der Mitte wie folgt abbrechen.

timer.cancel()

Diese Methode erzeugt für jeden Aufruf von Timer einen Thread. Es ist etwas ineffizient und unterscheidet sich von der JavaScript-Methode setTimeout.

Asynchrone Verarbeitung (asyncio)

In JavaScript behandelt die Ereignisschleife verschiedene Ereignisse in einem einzigen Thread. Es gibt eine Möglichkeit, dies in Python 3.4 und höher zu tun. Dies ist eine Methode, die asyncio verwendet, ein Paket, das standardmäßig in Python 3.4 oder höher enthalten ist. Wie bei JavaScript wird eine Ereignisschleife verwendet. In JavaScript waren Ereignisschleifen implizit, in Asyncio müssen Sie jedoch explizit sein.

Die folgenden beiden sind Codebeispiele. [^ 1] [^ 2] [^ 3]

Ich habe ein Beispiel für die Verwendung einer anderen API veröffentlicht, die fast der von mir verwendeten entspricht. Die call_later-Version löst ein Ereignis aus, das die angegebene Funktion nach (oder später) der in asyncio.call_later angegebenen Anzahl von Sekunden ausführt. Die Collout-Version [^ 4] wird mit einem Collout umbrochen, der die ursprüngliche Funktion aufruft, nachdem das angegebene Steuerelement für die Anzahl der Sekunden mit dem Namen wrap_with_delay an die Ereignisschleife zurückgegeben wurde. In diesem Code ist die call_later-Version einfacher, aber wenn mehrere Prozesse verkettet sind, ist die Collout-Version, die wie eine synchrone Verarbeitung geschrieben werden kann, leichter zu verstehen.

call_later version

import asyncio

def hello(target, loop=None):
    print("Hello {}".format(target))
    if loop is None:
        loop = asyncio.get_event_loop()
    loop.stop()  #Verarbeitung hinzugefügt, um die Ereignisschleife zu stoppen und die Steuerung zurückzugeben

loop = asyncio.get_event_loop() #Standard-Ereignisschleife abrufen
loop.call_later(3, hello, "World")
loop.run_forever() #Start der Ereignisschleife. Es wird nicht zurückkommen, es sei denn, Sie stoppen es ausdrücklich.
# loop.close()

Corroutine-Version

import asyncio

#Wenn Sie Async hinzufügen, ist dies keine normale Funktion, sondern ein Collout
async def wrap_with_delay(sec, func, *args):
    await asyncio.sleep(sec) #Geben Sie die Steuerung mit "Warten" an die Ereignisschleife zurück
    func(*args)

def hello(target, loop=None):
    print("Hello {}".format(target))
    if loop is None:
        loop = asyncio.get_event_loop()
    loop.stop()  #Verarbeitung hinzugefügt, um die Ereignisschleife zu stoppen und die Steuerung zurückzugeben
    
loop = asyncio.get_event_loop()
asyncio.ensure_future(wrap_with_delay(3, hello, "World"))
loop.run_forever()
# loop.close()

[^ 1]: Ursprünglich ist die Ereignisschleife ein Mechanismus zum zeitlichen Aufteilen mehrerer Prozesse und zum parallelen Ausführen. Daher ist es nicht üblich, wie in diesem Beispiel nur die verzögerte Ausführung in die Ereignisschleife einzufügen.

[^ 2]: Die Ausführung wird nicht beendet, wenn Sie die Ereignisschleife nicht drehen. Daher haben wir einen Prozess zum Stoppen der Schleife hinzugefügt, damit Sie sie problemlos ausprobieren können. Dies ist eine zusätzliche Verarbeitung aus der Perspektive des Vergleichs mit anderen Methoden.

[^ 3]: Wenn Sie die Standardereignisschleife schließen, führt asyncio.get_event_loop danach zu einem Fehler. Daher habe ich ihn auskommentiert und erwogen, ihn auf einem Jupyter-Notebook auszuführen.

[^ 4]: Dieser Code selbst funktioniert unter Python 3.5 oder höher, kann aber mit einer kleinen Änderung auch unter Python 3.4 ausgeführt werden

Recommended Posts

So etwas wie JS setTimeout in Python
So etwas wie tail -f in Python
Führen Sie so etwas wie Redis-Transaktionen in Python aus
Versuchen Sie etwas wie Python für-else in Ruby
Ich möchte so etwas wie Uniq in Python sortieren
Zeigen Sie Zeichen wie AA in Python an
Machen Sie so etwas wie einen Python-Interpreter mit Visual Studio Code
So etwas wie 40-32 / 2 = 4!
Ich wollte so etwas wie Elixirs Pipe in Python machen
Suchen Sie nach Dateien wie Linux Find in Python
# Ich habe so etwas wie Vlookup mit Python # 2 ausprobiert
Quadtree in Python --2
Python in der Optimierung
CURL in Python
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
Metaanalyse in Python
Unittest in Python
Epoche in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Plink in Python
Konstante in Python
FizzBuzz in Python
SQLite in Python
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
In Python flach drücken
Sortierte Liste in Python
Täglicher AtCoder # 36 mit Python
Clustertext in Python
AtCoder # 2 jeden Tag mit Python
Täglicher AtCoder # 32 in Python
Täglicher AtCoder # 6 in Python