Zum Hauptinhalt springen

Wie funktioniert Asynchronität mit async/await in Python

Asyncio - dies ist ein Modul in der Python-Standardbibliothek, mit dem Sie asynchronen Code mithilfe von Schlüsselwörtern schreiben können async und await. Mit diesem Ansatz können Sie parallele Aufgaben effizient ausführen, ohne den Hauptausführungsthread zu blockieren. In diesem Artikel erfahren Sie, wie Sie async und await verwenden, um asynchrone Funktionen zu erstellen und mit ihnen zu arbeiten.

Bevor Sie mit async und await beginnen, müssen Sie verstehen, was asynchrone Programmierung ist. In der klassischen synchronen Programmierung wird die Programmausführung unterbrochen, bis der aktuelle Vorgang abgeschlossen ist. In der asynchronen Programmierung können Sie mehrere Aufgaben gleichzeitig ausführen und separat warten, bis sie abgeschlossen sind, ohne den Hauptthread zu unterbrechen.

Die Schlüsselwörter async und await fügen die Möglichkeit hinzu, asynchronen Code auf die gleiche Weise wie synchronen Code zu schreiben, wodurch er für den Entwickler verständlicher und einfacher wird. Sie ermöglichen es Ihnen, asynchrone Funktionen zu definieren und sie zum Erstellen von Anwendungen zu verwenden, die mehrere Aufgaben gleichzeitig ausführen können.

Wie verwende ich async und await in Python richtig

  1. Definieren Sie die Funktion als async def . Wenn Sie eine asynchrone Operation durchführen müssen, definieren Sie eine Funktion mit dem async-Schlüsselwort vor def . Zum Beispiel:
async def fetch_data(url):# код. 
async def process_data():data = await fetch_data(url)# код. 
import asyncioasync def main():task1 = asyncio.create_task(fetch_data(url1))task2 = asyncio.create_task(fetch_data(url2))# код. asyncio.run(main())

Wenn Sie diese Regeln und Praktiken befolgen, können Sie async und await in Python effizient verwenden und flexibleren und reaktionsfähigeren asynchronen Code schreiben.

Abschnitt 1: Übergabe der Steuerung an eine asynchrone Funktion

Um eine Funktion als asynchron zu deklarieren, wird das async-Schlüsselwort verwendet, bevor es definiert wird:

async def my_function():# тело асинхронной функции

Wenn Sie die Funktion selbst als asynchron deklarieren, ist sie jedoch noch nicht asynchron, da sie mit dem await-Schlüsselwort andere asynchrone Funktionen oder Methoden aufrufen muss, die "Versprechen" zurückgeben.

Das await-Schlüsselwort stoppt die Ausführung der aktuellen asynchronen Funktion, bis das "Versprechen" erfüllt ist und der Wert zurückgegeben wird. Zu diesem Zeitpunkt wird die Steuerung an den Hauptthread des Programms zurückgegeben, der seine Arbeit fortsetzen kann, während die asynchrone Funktion auf die Erfüllung des "Versprechens" wartet.

Betrachten wir ein Beispiel:

import asyncioasync def hello_world():print("Hello")await asyncio.sleep(1)print("World")asyncio.run(hello_world())

Neben dem Aufrufen asynchroner Funktionen kann das await-Schlüsselwort auch verwendet werden, um Methoden aufzurufen, die "Versprechen" zurückgeben. Mit await können Sie die Steuerung also an asynchrone Funktionen übergeben und auf die Ausführung von Aufgaben warten, ohne den Hauptthread des Programms zu blockieren.

Abschnitt 2: Warten auf Ergebnisse von asynchronen Aufrufen

Wenn wir asynchrone Funktionen mit dem Schlüsselwort await aufrufen, wird die Ausführung der aktuellen Funktion angehalten, bis das Ergebnis des asynchronen Aufrufs empfangen wird. Dies ermöglicht es uns, die Ergebnisse von asynchronen Aufrufen zu verwenden und den Code erst dann weiter auszuführen, wenn sie abgeschlossen sind.

import asyncioasync def compute_square(x):print(f"Вычисление квадрата для числа ")await asyncio.sleep(1)return x**2async def main():# Вызываем функцию compute_square асинхронноtask = asyncio.create_task(compute_square(5))# Ожидаем завершения вызова и получаем результатresult = await taskprint(f"Результат: ")asyncio.run(main())

In diesem Beispiel erstellen wir eine asynchrone Funktion compute_square, die das Quadrat der Zahl x berechnet. Um eine lange Ausführung zu simulieren, unterbrechen wir die Ausführung einer Funktion für 1 Sekunde mit await asyncio.sleep(1) .

Als nächstes rufen wir in der main-Funktion compute_square mit dem Argument 5 asyncio asynchron auf.create_task(compute_square(5)) . Dieser Aufruf erstellt eine Aufgabe, die im Hintergrund ausgeführt wird.

Wenn das Programm ausgeführt wird, wird Folgendes angezeigt:

Вычисление квадрата для числа 5Результат: 25

Daher können wir durch die Verwendung von await die Ergebnisse von asynchronen Aufrufen erwarten und sie im weiteren Code verwenden.