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
首先,要了解 到底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(),将第二个表达式留给更具体的情况。
| 归档时间: | 
 | 
| 查看次数: | 3148 次 | 
| 最近记录: |