CodeGym /コース /Python SELF JA /非同期イテレータとジェネレータ

非同期イテレータとジェネレータ

Python SELF JA
レベル 26 , レッスン 3
使用可能

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

非同期ジェネレータは、asyncawaitキーワードを使って、値を非同期に生成するもので、普通のジェネレータに似た動作をするけど、非同期操作を実行するために実行を一時停止できるよ。

非同期ジェネレータの作成

非同期ジェネレータは、async defyieldを使って定義されるね。非同期ジェネレータは内部で 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というシンプルな構文で、非同期なシーケンスを扱えるため、コードの読みやすさと保守性が向上するんだよ。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION