ホームページ >バックエンド開発 >Python チュートリアル >HTTPX と asyncio を使用した Python の非同期 HTTP リクエスト
非同期プログラミングは、Python 開発においてますます重要になっています。 現在では asyncio
が標準ライブラリ コンポーネントとなり、多くの互換性のあるサードパーティ パッケージとなっているため、このパラダイムは今後も存続します。このチュートリアルでは、非ブロッキング コードの主要な使用例である、非同期 HTTP リクエストに HTTPX
ライブラリを使用する方法を示します。
「非同期」、「ノンブロッキング」、「同時」などの用語は混乱を招く可能性があります。 基本的に:
非同期コードはブロックを回避し、結果を待っている間に他のコードを実行できるようにします。 asyncio
ライブラリはこのためのツールを提供し、aiohttp
は特殊な HTTP リクエスト機能を提供します。 HTTP リクエストは、サーバーの応答を待機する必要があり、他のタスクを効率的に実行できる期間であるため、非同期に最適です。
Python 環境が構成されていることを確認してください。 必要に応じて、仮想環境ガイドを参照してください (Python 3.7 が必要です)。 HTTPX
:
<code class="language-bash">pip install httpx==0.18.2</code>
この例では、Pokémon API への 1 つの GET リクエストを使用して、ミュウ (ポケモン #151) のデータを取得します。
<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
はコルーチンを指定します。 await
はイベント ループに制御を渡し、結果が利用可能になると実行を再開します。
非同期性の真の力は、多数のリクエストを行うときに明らかです。この例では、最初の 150 匹のポケモンのデータを取得します:
<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>
実行の時間を計測します。 これを同期アプローチと比較してください。
同等の同期:
<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>
実行時の違いに注意してください。 HTTPX
の接続プーリングは差異を最小限に抑えますが、asyncio はさらなる最適化を提供します。
優れたパフォーマンスを得るには、asyncio.ensure_future
と asyncio.gather
を使用してリクエストを同時に実行します。
<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>
これにより、リクエストが同時に実行されるため、実行時間が大幅に短縮されます。 合計時間は、最長の単一リクエストの期間に近づきます。
HTTPX
と非同期プログラミングを使用すると、複数の HTTP リクエストのパフォーマンスが大幅に向上します。このチュートリアルでは、asyncio
の基本的な概要を説明します。その機能をさらに調べて、Python プロジェクトを強化してください。 代替の非同期 HTTP リクエスト処理については、aiohttp
を検討することを検討してください。
以上がHTTPX と asyncio を使用した Python の非同期 HTTP リクエストの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。