异步:长时间运行的任务具有启动延迟

时间:2018-09-16 21:04:01

标签: python task delay sleep python-asyncio

如果有的话,我想以一种更优雅的方式改善当前的工作状况。

我需要启动一组长时间运行的并发任务,其中一些任务是从延迟开始的。

到目前为止,我正在使用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处理任务?

1 个答案:

答案 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())
))