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

问题描述 投票:1回答:1

如果有的话,我想以更优雅的方式改善目前的工作情况。

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

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

python task delay sleep python-asyncio
1个回答
1
投票

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())
))
© www.soinside.com 2019 - 2024. All rights reserved.