CodeGym /Java Adesua /Python SELF TW /非同步迭代器和生成器

非同步迭代器和生成器

Python SELF TW
等級 26 , 課堂 3
開放

10.1 AsyncIterator

非同步迭代器 (AsyncIterator) 允許你處理那些會異步生成元素的數據序列。 它們用於非同步函數和協程中,來迭代那些可能會延遲獲取的數據,比如來自 網路請求的數據、非同步I/O操作或者其他非同步來源。

非同步迭代器

非同步迭代器需要實現兩個方法:

方法 __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