wait协程和await任务之间的区别

Roc*_*lee 3 python asynchronous python-asyncio fastapi aioredis

get_1在 FastAPI 上,我有一个调用下面的协程函数的端点get_2

get_1用途await redis.get(key)

get_2用途await asyncio.ensure_future(redis.get(key))

这两个函数在功能和性能方面有什么区别吗?

#redis.py

import asyncio
import aioredis

async def get_1(key):
   redis = aioredis.from_url("redis://localhost")
   value = await redis.get(key)
   return value

async def get_2(key):
   redis = aioredis.from_url("redis://localhost")
   value = await asyncio.ensure_future(redis.get(key))
   return value
Run Code Online (Sandbox Code Playgroud)

ale*_*ame 5

首先,要了解 到底await是什么以及有何task不同,我建议从本主题future开始,当然还有官方文档

至于你的问题,乍一看,这两个表达式await coro()和 都await create_task(coro())做同样的事情。他们启动协程,等待它完成并返回结果。

但有一些重要的区别:

  • await coro()导致直接调用协程代码而不返回事件循环的执行路径。这个问题已在本主题中进行了解释。
  • await create_task(coro())导致将协程包装在任务中,在事件循环中调度其执行,将执行路径返回到事件循环,然后等待结果。在这种情况下,在执行目标协程(调度为任务)之前,可以执行其他已调度的任务。通常,await不与 , 一起使用create_task,以允许生成的任务并行运行,但有时需要它,下一段中的示例
  • await coro()在变量的当前上下文中以及await create_task(coro())当前上下文的副本中执行目标协程(更多详细信息请参阅本主题

根据上述内容,您很可能需要await coro(),将第二个表达式留给更具体的情况。