为了账号安全,请及时绑定邮箱和手机立即绑定

asyncio-多次等待协程(定期任务)

asyncio-多次等待协程(定期任务)

婷婷同学_ 2021-04-05 16:19:49
我正在尝试为asyncio事件循环创建一个定期任务,如下所示,但是我遇到了“ RuntimeError:无法重用已经等待的协程”异常。显然,asyncio不允许等待与该bug线程中讨论的相同的等待功能。这是我尝试实现的方法: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而不是结果。有没有办法我可以多次等待相同的功能?
查看完整描述

1 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

似乎您在将异步函数(协程函数)与协程(这些异步函数产生的值)混淆了。


考虑以下异步功能:


async def sample():

    await asyncio.sleep(3.14)

您正在传递其呼叫的结果:add_periodic_task(sample(), 5)。


相反,您应该传递异步函数对象本身:add_periodic_task(sample, 5),并在包装器中调用它:


while True:

    await _async_func()

    await asyncio.sleep(_interval)


查看完整回答
反对 回复 2021-04-20
  • 1 回答
  • 0 关注
  • 394 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信