如果有的话,我想以一种更优雅的方式改善当前的工作状况。
我需要启动一组长时间运行的并发任务,其中一些任务是从延迟开始的。
到目前为止,我正在使用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处理任务?
答案 0 :(得分:1)
wrapper
的最后一行应包含 await :return await cb(*args, **kwargs)
。
对于这种启动延迟情况,是否有更好的方法来使用asyncio处理任务?
解决了以上错误,这就是您应该执行的操作。可能需要改进的地方是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())
))