我注意到,当我使用create_task生成异步任务时,它首先完成了其余的逻辑,而不是启动该任务。我被迫添加了一个await asyncio.sleep(0)来启动这项任务,这对我来说似乎有点烦琐和不干净。
下面是一些示例代码:
async def make_rpc_calls(...some args...)
val_1, val_2 = await asyncio.gather(rpc_call_1(...), rpc_call_2(...))
return process(val_1, val_2)
def some_very_cpu_intensive_function(...some args...):
// Does a lot of computation, can take 20 seconds to run
task_1 = asyncio.get_running_loop().create_task(make_rpc_calls(...))
intensive_result = some_very_cpu_intensive_function(...)
await task_1
process(intensive_result, task_1.result())每当我运行上面的代码时,它都会在启动昂贵的RPC之前运行some_very_cpu_intensive_function函数。我唯一能做到的就是:
async def make_rpc_calls(...some args...)
val_1, val_2 = await asyncio.gather(rpc_call_1(...), rpc_call_2(...))
return process(val_1, val_2)
def some_very_cpu_intensive_function(...some args...):
// Does a lot of computation, can take 20 seconds to run
task_1 = asyncio.get_running_loop().create_task(make_rpc_calls(...))
await asyncio.sleep(0)
intensive_result = some_very_cpu_intensive_function(...)
await task_1
process(intensive_result, task_1.result())对我来说,这就像是一个黑客--我强迫事件循环切换上下文,而且感觉我没有正确地使用异步框架。还有别的方法我应该接近这个吗?
发布于 2022-01-15 06:18:07
sleep()总是挂起当前任务,允许运行其他任务。
将延迟设置为0提供了允许运行其他任务的优化路径。这可以由长时间运行的函数使用,以避免在函数调用的整个过程中阻塞事件循环。
https://stackoverflow.com/questions/70718953
复制相似问题