首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何强制异步任务运行?

如何强制异步任务运行?
EN

Stack Overflow用户
提问于 2022-01-15 04:56:01
回答 1查看 192关注 0票数 0

我注意到,当我使用create_task生成异步任务时,它首先完成了其余的逻辑,而不是启动该任务。我被迫添加了一个await asyncio.sleep(0)来启动这项任务,这对我来说似乎有点烦琐和不干净。

下面是一些示例代码:

代码语言:javascript
复制
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函数。我唯一能做到的就是:

代码语言:javascript
复制
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())

对我来说,这就像是一个黑客--我强迫事件循环切换上下文,而且感觉我没有正确地使用异步框架。还有别的方法我应该接近这个吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-15 06:18:07

sleep()总是挂起当前任务,允许运行其他任务。

将延迟设置为0提供了允许运行其他任务的优化路径。这可以由长时间运行的函数使用,以避免在函数调用的整个过程中阻塞事件循环。

来源:https://docs.python.org/3/library/asyncio-task.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70718953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档