10.1 AsyncIterator
非同期イテレータ (AsyncIterator)
は、要素を非同期に生成するデータシーケンスを操作できるようにするもの。ネットワークリクエスト、非同期I/O操作、その他の非同期ソースからのデータを遅延して取得できる場合に、非同期関数やコルーチン内で使用されるよ。
非同期イテレータ
非同期イテレータは2つのメソッドを実装しなければならない:
メソッド __aiter__()
:
このメソッドは、非同期イテレータ自体を返す必要があるんだ。同期イテレータの__iter__()
メソッドと似ているね。
メソッド __anext__()
:
このメソッドは、次の値を非同期で返すか、要素がなくなった場合はStopAsyncIteration
例外を発生させる必要がある。同期イテレータの__next__()
メソッドと似ているよ。
例:
import asyncio
class AsyncIterator:
def __init__(self, start, end):
self.current = start
self.end = end
def __aiter__(self):
return self
async def __anext__(self)(self):
if self.current >= self.end:
raise StopAsyncIteration
await asyncio.sleep(1) # 非同期の遅延を模倣
self.current += 1
return self.current
async def main():
async for number in AsyncIterator(1, 5):
print(number)
asyncio.run(main())
非同期イテレータを使うと、他のタスクの実行をブロックせずに、データが入手可能になるごとに処理できるんだ。特にネットワークリクエストや他の非同期操作を扱うときに便利だよ。
非同期イテレータを使うことで、非同期にデータシーケンスを処理するためのコードが、より読みやすく保守しやすくなるんだ。
10.2 AsyncGenerator
非同期ジェネレータは、async
とawait
キーワードを使って、値を非同期に生成するもので、普通のジェネレータに似た動作をするけど、非同期操作を実行するために実行を一時停止できるよ。
非同期ジェネレータの作成
非同期ジェネレータは、async
def
とyield
を使って定義されるね。非同期ジェネレータは内部で await
を使って非同期操作を実行できる。
例:
async def async_generator():
for i in range(3):
await asyncio.sleep(1) # 非同期の遅延
yield i # 値の生成
非同期ジェネレータの使用
非同期ジェネレータは、async for
演算子を使って、非同期関数内で使用されるんだ。
import asyncio
async def main():
async for value in async_generator():
print(value)
asyncio.run(main())
非同期ジェネレータを使うことで、async for
というシンプルな構文で、非同期なシーケンスを扱えるため、コードの読みやすさと保守性が向上するんだよ。
GO TO FULL VERSION