gpt4 book ai didi

python - 异步: long running tasks with start delay

转载 作者:行者123 更新时间:2023-12-01 09:02:32 25 4
gpt4 key购买 nike

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

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

到目前为止,我正在使用 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 wait cb(*args, **kwargs)

Is there a better way of handling tasks with asyncio for such cases of start delay?

修复了上述错误后,您就应该这样做了。一个可能需要改进的地方是,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())
))

关于python - 异步: long running tasks with start delay,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52358358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com