异步迭代器

一、什么是异步迭代器?

实现了 __aiter__() 和 __anext__() 方法的对象。__anext__ 必须返回一个 awaitable对象。async for 会处理异步迭代器的 __anext__() 方法所返回的可等待对象,直到其引发一个 StopAsyncIteration 异常。

二、实例

class AsyncIterable:
    def __init__(self, iterable):
        self.iterable = iterable

    def __aiter__(self):
        return self

    async def __anext__(self):
        if not self.iterable:
            raise StopAsyncIteration
        return self.iterable.pop(0)

async def main():
    async for i in AsyncIterable([1, 2, 3, 4, 5]):
        await asyncio.sleep(1)
        print(i)

asyncio.run(main())

异步迭代器_第1张图片 

在这个例子中,AsyncIterable是一个异步迭代器,它每次产生一个元素,并在产生每个元素后等待1秒。

另一个例子

import asyncio


class Reader(object):
    """ 自定义异步迭代器(同时也是异步可迭代对象) """

    def __init__(self):
        self.count = 0

    async def readline(self):
        # await asyncio.sleep(1)
        self.count += 1
        if self.count == 10:
            return None
        return self.count

    def __aiter__(self):
        return self

    async def __anext__(self):
        val = await self.readline()
        if val == None:
            raise StopAsyncIteration
        return val

async def func():
    # 创建异步可迭代对象
    async_iter = Reader()
    # async for 必须要放在async def函数内,否则语法错误。
    async for item in async_iter:
        print(item)


asyncio.run(func())

异步迭代器_第2张图片

参考:

【python】async异步编程_python async_ynliii的博客-CSDN博客

https://baijiahao.baidu.com/s?id=1769488614922759759&wfr=spider&for=pc

你可能感兴趣的:(python,python,开发语言)