Python asyncio:具有启动延迟的长时间运行任务
如果有的话,我想用一种更优雅的方式来改善目前的工作环境 我需要启动一组长时间运行的并发任务,其中一些任务会延迟启动 到目前为止,我使用的是Python asyncio:具有启动延迟的长时间运行任务,python,task,delay,sleep,python-asyncio,Python,Task,Delay,Sleep,Python Asyncio,如果有的话,我想用一种更优雅的方式来改善目前的工作环境 我需要启动一组长时间运行的并发任务,其中一些任务会延迟启动 到目前为止,我使用的是gather,并制作了一个小包装函数,将任务包装在asyncio.sleep 包装器如下所示: 异步def包装(延迟、cb、*args、**kwargs): 等待异步睡眠(延迟) 返回cb(*args,**kwargs) 在主要功能中: loop=asyncio.get\u event\u loop() 循环。运行\u直到\u完成(asyncio.gathe
gather
,并制作了一个小包装函数,将任务包装在asyncio.sleep
包装器如下所示:
异步def包装(延迟、cb、*args、**kwargs):
等待异步睡眠(延迟)
返回cb(*args,**kwargs)
在主要功能中:
loop=asyncio.get\u event\u loop()
循环。运行\u直到\u完成(asyncio.gather(
即时协同程序(),
包装器(2.0,包装的\u协同程序)
))
我发现,call\u later
可能很有用,但它不希望使用异步函数作为回调函数
对于这种启动延迟的情况,是否有更好的异步处理任务的方法?包装的最后一行应该包含一个等待:
返回等待cb(*args,**kwargs)
对于这种启动延迟的情况,是否有更好的异步IO处理任务的方法
修复了上面的错误后,您应该这样做。一个可能需要改进的地方是,wrapper
不需要接受回调和参数,它可以接受一个协同路由对象(或者任何类型的等待对象)。这是安全的,因为当您调用协程函数时,协程不会开始运行,而只在事件循环驱动结果对象时才开始运行
生成的API更简单,更接近asyncio提供的API:
async def wrapper(delay, coro):
await asyncio.sleep(delay)
return await coro
用法:
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(
immediate_coroutine(),
wrapper(2.0, wrapped_coroutine())
))