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在这个迭代器上。
在我看来,你的方法很好。请注意,从 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)
但是,您将无法在多个协程之间共享它们。您必须在任务中运行时钟并通过异步迭代接口提供数据,这本质上就是您在代码中所做的事情。这是一个可能的实现。
| 归档时间: |
|
| 查看次数: |
1325 次 |
| 最近记录: |