Python asyncio-多次等待协同路由(定期任务)
我试图为asyncio事件循环创建一个周期性任务,如下所示,但是我得到了一个“RuntimeError:无法重用已经等待的协同路由”异常。显然,asyncio不允许等待与中讨论的相同的等待函数。这就是我如何尝试实现它的:Python asyncio-多次等待协同路由(定期任务),python,scheduled-tasks,python-asyncio,periodic-task,Python,Scheduled Tasks,Python Asyncio,Periodic Task,我试图为asyncio事件循环创建一个周期性任务,如下所示,但是我得到了一个“RuntimeError:无法重用已经等待的协同路由”异常。显然,asyncio不允许等待与中讨论的相同的等待函数。这就是我如何尝试实现它的: import asyncio class AsyncEventLoop: def __init__(self): self._loop = asyncio.get_event_loop() def add_periodic_
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)将在睡眠时间间隔内执行。我从中得到了执行定期任务的灵感
根据上面提到的bug线程,我推断RuntimeError背后的想法是,开发人员不会意外地等待同一个协程两次或两次以上,因为协程将被标记为已完成,并且不会产生任何结果。有没有一种方法可以让我多次等待同一个函数?您似乎混淆了异步函数(协程函数)和协程(这些异步函数产生的值) 考虑这个异步函数:
async def sample():
await asyncio.sleep(3.14)
您正在传递其调用的结果:add\u periodic\u task(sample(),5)
相反,您应该传递异步函数对象本身:add\u periodic\u task(示例,5)
,并在包装器中调用它:
while True:
await _async_func()
await asyncio.sleep(_interval)
为了加剧混乱,链接错误的描述有一个可怕的打字错误,使得它看起来像是建议不允许实例化并连续两次等待同一个协同路由函数![随后的注释]()清除混乱,明确等待等待已久的协同程序对象是不允许的。考虑到这一点,如果旧的行为被恢复,并且“<代码>运行时错误< /代码>被删除,会考虑会发生什么。周期性的协程不会被神奇地重置并从一开始就启动(Python中没有自动实现这一点的机制,也不需要这样的机制,因为同样的事情可以通过循环实现)。相反,下一个
await
将产生一个虚假的None
值,这不是任何人都会期望或想要的。