aiohttp は、Python の優れた非同期 Web フレームワークです。効率的な非同期 Web アプリケーションや非同期 HTTP クライアントを構築するのに役立ちます。この記事では、aiohttp とは何かとその使用方法について詳しく説明します。シンプルでわかりやすい例を使用して、非同期プログラミングと非同期リクエストと非同期 HTTP クライアントの処理方法を理解できるようにします。
aiohttpとは何ですか?
aiohttp は、非同期 I/O に基づく Web フレームワークであり、高パフォーマンスでオーバーヘッドの低い非同期 Web サービスの提供に重点を置いています。これにより、プログラムの実行をブロックすることなく、多数の同時リクエストを同時に処理できるようになります。 aiohttp は、Python の async/await 構文を使用して非同期プログラミングを実装します。これにより、非同期コードの記述がより直観的かつ簡潔になります。
非同期プログラミングの概要
従来の同期プログラミングでは、各タスクは順番に実行されます。タスクが時間のかかる操作 (ネットワーク要求やファイル読み取りなど) を待機する必要がある場合、プログラム全体がブロックされ、他のタスクが実行できなくなります。非同期プログラミングでは、特定のタスクを待機している間も他のタスクの実行を続けることができるため、システム リソースが最大限に活用され、プログラムのパフォーマンスが向上します。
Python では、async/await を使用して非同期関数を宣言し、非同期操作を実行できます。非同期関数はコルーチン オブジェクトを返します。このオブジェクトはイベント ループでの実行をスケジュールできます。
- コルーチン: コルーチンは、実行を一時停止し、後で再開できる関数です。これにより、関数内に状態を保存できます。コルーチンは、I/O 操作を待機している間に他のタスクを実行できるため、非同期プログラミングで非常に役立ちます。
- イベント ループ: イベント ループは非同期プログラミングの中核であり、イベントの継続的な監視と処理を担うループ構造です。 Python では、
asyncio
モジュールによって提供されるイベント ループを使用して、非同期コルーチンの実行を駆動できます。
aiohttp フレームワークの紹介
正式な住所
aiohttp の正式なアドレスは次のとおりです。AIOHTTP へようこそ — aiohttp 3.8.6 ドキュメント
背景
aiohttp は元々、高速かつ柔軟で使いやすい非同期 Web フレームワークを提供するために Andrew Svetlov によって開発されました。機能と利点:
- 非同期 Web サーバー: aiohttp は、同時リクエストを処理する非同期 Web サーバーとして使用でき、WebSocket プロトコルと HTTP/2 プロトコルをサポートします。
- 非同期 HTTP クライアント: aiohttp は、他のサーバーに非同期リクエストを行うための高性能の非同期 HTTP クライアントを提供します。
- 軽量: aiohttp はシンプルな設計でコードが少なく、理解と保守が簡単です。
- 組み込みの WebSocket サポート: aiohttp には WebSocket のサポートが組み込まれており、リアルタイムの双方向通信を簡単に実現できます。
- 互換性: aiohttp は Python 3.5 以降と互換性があり、他の非同期ライブラリやフレームワークとシームレスに統合できます。
aiohttpの使い方は?
aiohttp をインストールする
aiohttp の使用を開始する前に、aiohttp をインストールする必要があります。 pip を使用してインストールできます。
pip install aiohttp
実際のケース - 非同期 HTTP サーバー
aiohttp は、aiohttp.web
と aiohttp.client
という 2 つの主要モジュールを提供します。前者は Web アプリケーションの構築に使用され、後者は非同期 HTTP クライアントの作成に使用されます。
まず、aiohttp.web
モジュールを見てみましょう。これは、Web アプリケーションを構築するための鍵です。以下は単純な非同期 HTTP サーバーです:
import asyncio
from aiohttp import web
async def handle(request):
return web.Response(text="Hello, aiohttp!")
app = web.Application()
app.router.add_get('/', handle)
# 手动启动事件循环
async def start_app():
runner = web.AppRunner(app)
await runner.setup()
site = web.TCPSite(runner, 'localhost', 8080)
await site.start()
if __name__ == "__main__":
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(start_app())
loop.run_forever()
except KeyboardInterrupt:
pass
finally:
loop.run_until_complete(loop.shutdown_asyncgens())
loop.close()
IDE エディタで上記のコードを実行すると、aiohttp サーバーがすでにローカルで実行されており、デフォルト ポートでリッスンしていることがわかります。ブラウザで http://localhost:8080
を開くと、「Hello, aiohttp!」という応答が表示されます。
aiohttp インターフェイスのデバッグ
Apifox = Postman + Swagger + Mock + JMeter、Apifox は http(s)、WebSocket、Socket、gRPC、 およびその他のプロトコル インターフェイスでは、バックエンド担当者がサービス インターフェイスの作成を完了すると、テスト段階で Apifox を通じてインターフェイスの正確性を検証できます。インターフェイスはプロジェクトの立ち上げの効率を大幅に促進します。 Dubbo
この記事の例では、Apifox を通じてインターフェイスをテストできます。新しいプロジェクトを作成した後、プロジェクトで 「デバッグ モード」 を選択します。リクエスト アドレスを入力した後、すぐにリクエストを送信してレスポンスを取得できます。実際のケースを図に示します。
非同期リクエストの処理 - POST リクエストの例
非同期 POST リクエストを処理する方法を示してみましょう。
from aiohttp import web
async def handle(request):
data = await request.post()
name = data.get('name')
return web.Response(text=f"Hello, {name}!")
app = web.Application()
app.router.add_post('/', handle)
web.run_app(app)
この例では、POST リクエスト処理関数を定義しますhandle
。 POST リクエストを受信すると、リクエストから name
という名前のパラメータを取得し、対応するウェルカム メッセージを返します。
非同期の処理HTTP クライアント
aiohttp は、非同期 Web サーバーであるだけでなく、他のサーバーに非同期リクエストを行うための非同期 HTTP クライアントも提供します。簡単な例を次に示します。
import aiohttp
import asyncio
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def main():
url = 'https://api.example.com/data'
result = await fetch(url)
print(result)
asyncio.run(main())
上記のコードでは、aiohttp の を使用して非同期 GET リクエストを開始し、応答コンテンツを返す fetch
関数を定義します。 関数では、 関数を呼び出し、結果を出力します。 ClientSession
main
fetch
ヒント、コツ、考慮事項
- 非同期プログラミングでは、コルーチン、イベント ループ、非同期コンテキスト マネージャーなどの概念を理解し、Python の async/await 構文に精通している必要があります。
- aiohttp を使用する場合は、プログラムの安定性を確保するために例外やエラーの処理に注意してください。
- 非同期コードを作成する場合は、asyncio が提供するツールと関数を最大限に活用してください。たとえば、
asyncio.gather()
は複数のコルーチンを同時に実行できます。 - 大規模なアプリケーションでは、パフォーマンス分析ツールの使用を検討して、パフォーマンスのボトルネックを検出して解決します。
要約する
この記事では、aiohttp とは何か、およびそれを非同期プログラミングに使用する方法について説明します。 aiohttp の機能と利点について学び、簡単なケースを通じて非同期 HTTP サーバーと非同期 HTTP クライアントを構築する方法を示しました。この記事が、aiohttp をすぐに使い始めて、非同期プログラミングにおけるその利点を活用するのに役立つことを願っています。
知識の拡大:
参考リンク:
- aiohttp 公式ドキュメント:AIOHTTP へようこそ — aiohttp 3.8.6 ドキュメント
- Python asyncio ドキュメント:asyncio — 非同期 I/O — Python 3.12.0 ドキュメント