异步迭代器以固定间隔滴答

Dur*_*ndA 5 python asynchronous python-3.x python-asyncio

我正在实现一个要使用的异步迭代器,async for它应该以(大部分)固定间隔返回一个新值。

我们可以用一个简单的时钟来说明这样的迭代器,它每 ~n 秒增加一个计数器:

import asyncio

class Clock(object):
    def __init__(self, interval=1):
        self.counter = 0
        self.interval = interval
        self.tick = asyncio.Event()
        asyncio.ensure_future(self.tick_tock())

    async def tick_tock(self):
        while True:
            self.tick.clear()
            await asyncio.sleep(self.interval)
            self.counter = self.__next__()
            self.tick.set()

    def __next__(self):
        self.counter += 1
        return self.counter

    def __aiter__(self):
        return self

    async def __anext__(self):
        await self.tick.wait()
        return self.counter
Run Code Online (Sandbox Code Playgroud)

有没有比使用更好或更干净的方法asyncio.Event?不止一个协程会async for在这个迭代器上。

Vin*_*ent 2

在我看来,你的方法很好。请注意,从 python 3.6 开始,您还可以使用异步生成器

async def clock(start=0, step=1, interval=1.):
    for i in count(start, step):
        yield i
        await asyncio.sleep(interval)
Run Code Online (Sandbox Code Playgroud)

但是,您将无法在多个协程之间共享它们。您必须在任务中运行时钟并通过异步迭代接口提供数据,这本质上就是您在代码中所做的事情。这是一个可能的实现