Eine asynchrone Aufgabe ist ein Objekt, das eine asynchrone Coroutine unabhängig plant und ausführt. Es stellt ein Handle für die versendete Coroutine bereit, das Asyncio-Programme abfragen und für die Interaktion mit der Coroutine verwenden können.
Aufgaben werden aus Coroutinen erstellt. Es nimmt ein Coroutine-Objekt, umschließt die Coroutine, plant ihre Ausführung und stellt Methoden für die Interaktion mit ihr bereit. Aufgaben werden selbstständig ausgeführt. Dies bedeutet, dass es in der Asyncio-Ereignisschleife geplant wird und unabhängig davon ausgeführt wird, was in der Coroutine passiert, die es erstellt hat. Dies unterscheidet sich von der direkten Ausführung der Coroutine, bei der der Aufrufer auf den Abschluss warten muss.
Die Klasse asyncio.Task erweitert die Klasse asyncio.Future, von der eine Instanz erwartet wird. Future ist eine Klasse niedrigerer Ebene, die das Ergebnis darstellt, das letztendlich eintreffen wird. Klassen, die die Future-Klasse erweitern, werden oft als Future-like bezeichnet.
Da asynchrone Aufgaben erwartbar sind, bedeutet dies, dass die Coroutine Warteausdrücke verwenden kann, um auf den Abschluss der Aufgabe zu warten.
... # wait for a task to be done await task
Da wir nun wissen, was eine Asyncio-Aufgabe ist, sehen wir uns an, wie man eine erstellt.
Erstellen Sie eine Aufgabe mit der bereitgestellten Coroutine-Instanz. Denken Sie daran, dass eine Coroutine mithilfe eines asynchronen Def-Ausdrucks definiert wird und wie eine Funktion aussieht.
# define a coroutine async def task_coroutine(): # ...
Aufgaben können nur in Coroutinen erstellt und geplant werden. Es gibt zwei Hauptmethoden zum Erstellen und Planen von Aufgaben:
Erstellen Sie Aufgaben mithilfe einer High-Level-API (bevorzugt)
... # create a coroutine coro = task_coroutine() # create a task from a coroutine task = asyncio.create_task(coro)
Dies kann durch die Verwendung zusammengesetzter Anweisungen in einer Zeile erreicht werden.
... # create a task from a coroutine task = asyncio.create_task(task_coroutine())
Dies wird ein paar Dinge bewirken:
2.2. Low-Level-API
Die erste Methode ist die Verwendung der Funktion asyncio.ensure_future(). Diese Funktion benötigt eine Aufgabe, eine Zukunft oder ein zukunftsähnliches Objekt wie eine Coroutine und optional eine Schleife für deren Planung. Wenn keine Schleife bereitgestellt wird, wird sie in der aktuellen Ereignisschleife geplant.
Wenn für diese Funktion eine Coroutine bereitgestellt wird, wird sie für uns in eine Instanz verpackt und dann zurückgegeben.
... # create and schedule the task task = asyncio.ensure_future(task_coroutine())
Eine weitere Low-Level-Funktion, die wir zum Erstellen und Planen von Aufgaben verwenden können, ist die Methode loop.create_task(). Diese Funktion erfordert Zugriff auf eine bestimmte Ereignisschleife, in der die Coroutine als Aufgabe ausgeführt wird.
Wir können die Instanz der aktuellen Ereignisschleife im Asyncio-Programm über die Funktion asyncio.get_event_loop() abrufen. Dies kann dann verwendet werden, um die Methode create_task() aufzurufen, um eine Task-Instanz zu erstellen und deren Ausführung zu planen.
... # get the current event loop loop = asyncio.get_event_loop() # create and schedule the task task = loop.create_task(task_coroutine())
3. Wann wird die Aufgabe ausgeführt?
Obwohl wir die Coroutine über die Funktion create_task() so planen können, dass sie unabhängig als Aufgabe ausgeführt wird, wird sie möglicherweise nicht sofort ausgeführt. Tatsächlich wird die Aufgabe erst ausgeführt, wenn die Ereignisschleife ausgeführt werden kann.
Dies geschieht so lange, bis alle anderen Coroutinen nicht mehr ausgeführt werden und die Aufgabe an der Reihe ist.
Wenn wir beispielsweise ein Asyncio-Programm mit einer Coroutine haben, die Aufgaben erstellt und plant, werden die geplanten Aufgaben erst ausgeführt, wenn die aufrufende Coroutine, die die Aufgabe erstellt hat, angehalten wird.
Dies kann passieren, wenn die aufrufende Coroutine schlafen geht, auf eine andere Coroutine oder Aufgabe wartet oder auf eine neue geplante Aufgabe wartet.
... # create a task from a coroutine task = asyncio.create_task(task_coroutine()) # await the task, allowing it to run await task
Jetzt wissen wir, was Aufgaben sind und wie wir sie planen.
Das obige ist der detaillierte Inhalt vonSo erstellen und führen Sie asynchrone Aufgaben in Python aus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!