CodeGym /Các khóa học /Python SELF VI /AsyncIterator và AsyncGenerator

AsyncIterator và AsyncGenerator

Python SELF VI
Mức độ , Bài học
Có sẵn

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 asyncawait. 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 defyield. 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ộ.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION