非同期プログラミングは、効率的なシステムを構築する上で避けて通れないテーマの一つです。Pythonでは`async for`構文を使うことで、非同期イテラブルのループを簡潔に記述できます。この記事では`async for`による非同期イテラブルの基本的な使い方から、その具体的な応用例までを解説します。
目次
async forとは
`async for`は、Pythonで非同期イテラブルをループ処理する際に使用する構文です。非同期イテラブルは、通常のイテラブル(リストやタプルなど)とは異なり、各要素が非同期に生成される特性を持っています。これにより、効率的な非同期プログラミングが可能になります。
非同期イテラブルとは
非同期イテラブルは、`__aiter__()`メソッドと`__anext__()`メソッドを持つオブジェクトです。これらのメソッドは非同期に動作し、`await`キーワードで待機可能です。
class AsyncIterable:
async def __aiter__(self):
return self
async def __anext__(self):
# 何らかの非同期処理
return some_data
基本的な使い方
以下は非同期イテラブルを`async for`でループする基本的なコード例です。
async def main():
async for item in AsyncIterable():
print(item)
応用例
Webスクレイピング
`async for`を用いて、非同期に複数のWebページからデータを取得する例です。
import aiohttp
import asyncio
async def fetch_page(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def main():
urls = ["https://example.com/page1", "https://example.com/page2"]
async for url in urls:
page_content = await fetch_page(url)
print(f"Content for {url}: {page_content[:100]}") # 最初の100文字を表示
非同期DBクエリ
非同期データベースドライバを使用して、`async for`でクエリ結果を処理する例です。
import aiosqlite
async def query_db():
async with aiosqlite.connect("example.db") as db:
async with db.cursor() as cursor:
await cursor.execute("SELECT * FROM users")
async for row in cursor:
print(row)
ストリーム処理
ストリームから非同期にデータを読み込む例です。
async def stream_reader(stream):
async for line in stream:
print(f"Received: {line}")
async def main():
# 何らかの非同期ストリーム
stream = some_async_stream()
await stream_reader(stream)
まとめ
`async for`を使うことで、非同期イテラブルのループ処理を効率的に行えます。Webスクレイピングや非同期DBクエリ、ストリーム処理など、多岐にわたる用途で活用できます。これを機に、非同期プログラミングの技術をぜひ身につけてください。
コメント