我正在尝试为asyncio事件循环创建一个周期性任务,如下所示。但是,我遇到了"RuntimeError: cannot reuse already awaited coroutine" 异常。显然,asyncio不允许等待相同的可等待函数,正如这个错误线程中所讨论的那样。以下是我的实现方式:
import asyncio
class AsyncEventLoop:
def __init__(self):
self._loop = asyncio.get_event_loop()
def add_periodic_task(self, async_func, interval):
async def wrapper(_async_func, _interval):
while True:
await _async_func # This is where it goes wrong
await asyncio.sleep(_interval)
self._loop.create_task(wrapper(async_func, interval))
return
def start(self):
self._loop.run_forever()
return
由于我的while循环,相同的可等待函数(_async_func)将会在两次执行之间有一个休眠间隔。我从如何使用asyncio定期执行函数中获取了实现周期性任务的灵感。
从上面提到的错误线程中,我推断出RuntimeError背后的想法是为了防止开发人员意外地重复等待同一个协程,因为该协程将被标记为完成并产生None而不是结果。是否有办法可以多次等待同一个函数?
RuntimeError
会发生什么。周期性协程不会神奇地重置并从头开始(Python中没有自动实现这种机制,也不需要,因为可以使用循环来实现相同的效果)。相反,下一个await
将产生一个虚假的None
值,这不是任何人所期望或想要的。 - user4815162342