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
非同步生成器允許你使用 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