Asynchrone Programmierung wird in der Python-Entwicklung immer wichtiger. Da asyncio
mittlerweile eine Standardbibliothekskomponente und viele kompatible Pakete von Drittanbietern ist, wird dieses Paradigma Bestand haben. Dieses Tutorial demonstriert die Verwendung der HTTPX
-Bibliothek für asynchrone HTTP-Anfragen – ein Hauptanwendungsfall für nicht blockierenden Code.
Begriffe wie „asynchron“, „nicht blockierend“ und „gleichzeitig“ können verwirrend sein. Im Wesentlichen:
Asynchroner Code vermeidet Blockierungen und ermöglicht die Ausführung anderer Codes, während auf Ergebnisse gewartet wird. Die asyncio
-Bibliothek stellt hierfür Tools bereit und aiohttp
bietet spezielle HTTP-Anfragefunktionen. HTTP-Anfragen eignen sich ideal für Asynchronität, da sie das Warten auf Serverantworten erfordern, einen Zeitraum, in dem andere Aufgaben effizient ausgeführt werden können.
Stellen Sie sicher, dass Ihre Python-Umgebung konfiguriert ist. Lesen Sie bei Bedarf einen Leitfaden für virtuelle Umgebungen (Python 3.7 ist erforderlich). Installieren Sie HTTPX
:
<code class="language-bash">pip install httpx==0.18.2</code>
In diesem Beispiel wird eine einzelne GET-Anfrage an die Pokémon-API verwendet, um Daten für Mew (Pokémon #151) abzurufen:
<code class="language-python">import asyncio import httpx async def main(): url = 'https://pokeapi.co/api/v2/pokemon/151' async with httpx.AsyncClient() as client: response = await client.get(url) pokemon = response.json() print(pokemon['name']) asyncio.run(main())</code>
async
bezeichnet eine Coroutine; await
übergibt die Kontrolle an die Ereignisschleife und setzt die Ausführung fort, sobald das Ergebnis verfügbar ist.
Die wahre Kraft der Asynchronität zeigt sich, wenn zahlreiche Anfragen gestellt werden. In diesem Beispiel werden Daten für die ersten 150 Pokémon abgerufen:
<code class="language-python">import asyncio import httpx import time start_time = time.time() async def main(): async with httpx.AsyncClient() as client: for number in range(1, 151): url = f'https://pokeapi.co/api/v2/pokemon/{number}' response = await client.get(url) pokemon = response.json() print(pokemon['name']) asyncio.run(main()) print(f"--- {time.time() - start_time:.2f} seconds ---")</code>
Planen Sie die Ausführung. Vergleichen Sie dies mit einem synchronen Ansatz.
Das synchrone Äquivalent:
<code class="language-python">import httpx import time start_time = time.time() client = httpx.Client() for number in range(1, 151): url = f'https://pokeapi.co/api/v2/pokemon/{number}' response = client.get(url) pokemon = response.json() print(pokemon['name']) print(f"--- {time.time() - start_time:.2f} seconds ---")</code>
Beachten Sie den Laufzeitunterschied. Das Verbindungspooling von HTTPX
minimiert die Ungleichheit, aber Asyncio bietet weitere Optimierung.
Für eine bessere Leistung führen Sie Anfragen gleichzeitig mit asyncio.ensure_future
und asyncio.gather
aus:
<code class="language-python">import asyncio import httpx import time start_time = time.time() async def fetch_pokemon(client, url): response = await client.get(url) return response.json()['name'] async def main(): async with httpx.AsyncClient() as client: tasks = [asyncio.ensure_future(fetch_pokemon(client, f'https://pokeapi.co/api/v2/pokemon/{number}')) for number in range(1, 151)] pokemon_names = await asyncio.gather(*tasks) for name in pokemon_names: print(name) asyncio.run(main()) print(f"--- {time.time() - start_time:.2f} seconds ---")</code>
Dadurch wird die Ausführungszeit durch die gleichzeitige Ausführung von Anforderungen erheblich verkürzt. Die Gesamtzeit nähert sich der Dauer der längsten Einzelanfrage.
Die Verwendung von HTTPX
und asynchroner Programmierung verbessert die Leistung für mehrere HTTP-Anfragen erheblich. Dieses Tutorial bietet eine grundlegende Einführung in asyncio
; Entdecken Sie die Möglichkeiten weiter, um Ihre Python-Projekte zu verbessern. Erwägen Sie, aiohttp
nach einer alternativen asynchronen HTTP-Anforderungsverarbeitung zu durchsuchen.
Das obige ist der detaillierte Inhalt vonAsynchrone HTTP-Anfragen in Python mit HTTPX und Asyncio. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!