如果有的话,我想以更优雅的方式改善目前的工作情况。
我需要启动一组长时间运行的并发任务,其中一些任务以延迟开始。
到目前为止,我正在使用gather
并制作了一个小包装函数,在asyncio.sleep
之后包装任务
包装如下:
async def wrapper(delay, cb, *args, **kwargs):
await asyncio.sleep(delay)
return cb(*args, **kwargs)
并在主要功能:
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(
immediate_coroutine(),
wrapper(2.0, wrapped_coroutine)
))
我发现call_later
可能很有用,但它不希望异步函数作为它的回调。
对于这种启动延迟的情况,是否有更好的方法来处理asyncio的任务?
wrapper
的最后一行应包含await:return await cb(*args, **kwargs)
。
对于这种启动延迟的情况,是否有更好的方法来处理asyncio的任务?
修复了上述错误,这就是你应该怎么做的。一个可能的改进领域是wrapper
不需要接受回调和参数,它可以接受一个协程对象(或任何类似的等待,真的)。这是安全的,因为在调用coroutine函数时,协同程序不会开始运行,而只是在事件循环驱动生成的对象时才开始运行。
生成的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())
))