asyncio 非同期プログラミング入門
asyncio を使った非同期プログラミング入門
非同期プログラミングは、従来の並行処理とは異なるアプローチです。 「実行のブロックを避ける」という概念に基づき、I/O待ちなどの処理を待つ間もプログラムの実行を継続させます。 これにより、CPUのアイドル時間を削減し、特にI/Oがボトルネックとなるアプリケーションにおいて、パフォーマンスを大幅に向上させることができます。
asyncio とは?
Python の asyncio モジュールは、このような非同期プログラミングを実現するための標準ライブラリです。
async キーワードを使って、コルーチン(非同期関数)を定義し、await キーワードを使って、他のコルーチンの実行を一時停止させ、完了するのを待つことができます。
非同期プログラミングの基本的な流れ
1. コルーチンの定義: async def を使って、非同期関数 (コルーチン) を定義します。
2. await の使用: await キーワードを使って、他のコルーチンの実行を待つことができます。await は、指定されたコルーチンが完了するまで、現在のコルーチンの実行を中断します。
3. イベントループ: asyncio のイベントループが、コルーチンの実行をスケジュールし、管理します。
簡単な例:複数の HTTP リクエストを同時に送信
import asyncio
import aiohttp
async def fetch_url(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
async with aiohttp.ClientSession() as session:
urls = [
"https://www.example.com",
"https://www.google.com",
"https://www.python.org"
]
tasks = [fetch_url(session, url) for url in urls]
results = await asyncio.gather(*tasks)
for i, result in enumerate(results):
print(f"URL: {urls[i]}, Content: {result[:50]}...") #最初の50文字を表示
await main()
この例では、asyncio.gather を使用して、複数の URL に対して同時に HTTP リクエストを送信しています。
asyncio.gather は、与えられたすべてのコルーチンが完了するまで待機し、完了した結果をリストとして返します。
まとめ
asyncio を使うことで、I/Oバウンドな処理が多いアプリケーションのパフォーマンスを向上させることができます。
非同期プログラミングは、従来の並行処理とは異なるアプローチであり、理解を深めるための学習コストがかかる場合があります。
しかし、その効果は非常に大きく、現代的なアプリケーション開発において重要なスキルとなっています。
Comments
Post a Comment