10.1 AsyncIterator
AsyncIterator cho phép bạn làm việc với các chuỗi dữ liệu mà phần tử được tạo ra không đồng bộ. Chúng được sử dụng trong các hàm và coroutine không đồng bộ để duyệt qua dữ liệu có thể nhận được với độ trễ, ví dụ từ các yêu cầu mạng, các thao tác I/O không đồng bộ hoặc các nguồn không đồng bộ khác.
AsyncIterator
AsyncIterator phải triển khai hai phương thức:
Phương thức __aiter__():
Phương thức này phải trả về chính AsyncIterator. Nó tương tự như phương thức __iter__() cho các iterator đồng bộ.
Phương thức __anext__():
Phương thức này phải trả về giá trị tiếp theo không đồng bộ hoặc gọi một ngoại lệ StopAsyncIteration nếu không còn phần tử. Nó tương tự như phương thức __next__() cho các iterator đồng bộ.
Ví dụ:
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) # Giả lập độ trễ không đồng bộ
self.current += 1
return self.current
async def main():
async for number in AsyncIterator(1, 5):
print(number)
asyncio.run(main())
AsyncIterator cho phép xử lý dữ liệu khi chúng đến, mà không chặn việc thực thi các nhiệm vụ khác. Điều này đặc biệt hữu ích cho làm việc với các yêu cầu mạng và các thao tác không đồng bộ khác.
Sử dụng AsyncIterator giúp viết mã dễ đọc và bảo trì hơn cho việc xử lý các chuỗi dữ liệu không đồng bộ.
10.2 AsyncGenerator
AsyncGenerator cho phép tạo ra các giá trị không đồng bộ, sử dụng từ khóa async và await. Chúng hoạt động tương tự như generator thông thường, nhưng có thể tạm dừng thực thi để thực hiện các thao tác không đồng bộ.
Tạo AsyncGenerator
AsyncGenerator được định nghĩa bằng việc sử dụng async def và yield. AsyncGenerators có thể sử dụng await bên trong để thực hiện các thao tác không đồng bộ.
Ví dụ:
async def async_generator():
for i in range(3):
await asyncio.sleep(1) # Độ trễ không đồng bộ
yield i # Tạo giá trị
Sử dụng AsyncGenerator
AsyncGenerators được sử dụng bên trong các hàm không đồng bộ với từ khóa async for.
import asyncio
async def main():
async for value in async_generator():
print(value)
asyncio.run(main())
AsyncGenerators cải thiện độ đọc và bảo trì của mã, cho phép sử dụng cấu trúc cú pháp đơn giản async for để làm việc với các chuỗi không đồng bộ.
GO TO FULL VERSION