Heim >Backend-Entwicklung >Python-Tutorial >Asynchrone HTTP-Anfragen in Python mit HTTPX und Asyncio

Asynchrone HTTP-Anfragen in Python mit HTTPX und Asyncio

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-11 07:25:42523Durchsuche

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.

Was ist nicht blockierender Code?

Begriffe wie „asynchron“, „nicht blockierend“ und „gleichzeitig“ können verwirrend sein. Im Wesentlichen:

  • Asynchrone Routinen können „pausieren“, während sie auf Ergebnisse warten, sodass andere Routinen gleichzeitig ausgeführt werden können.
  • Dies erweckt den Anschein einer gleichzeitigen Ausführung, auch wenn echte Parallelität möglicherweise nicht im Spiel ist.

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.

Einrichtung

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>

Eine HTTP-Anfrage mit HTTPX stellen

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.

Mehrere Anfragen stellen

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.

Synchroner Anforderungsvergleich

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.

Erweiterte asynchrone Techniken

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.

Fazit

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. Asynchronous HTTP Requests in Python with HTTPX and asyncio Asynchronous HTTP Requests in Python with HTTPX and asyncio Asynchronous HTTP Requests in Python with HTTPX and asyncio

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Python-Listen-Tutorial, Tag 2Nächster Artikel:Python-Listen-Tutorial, Tag 2