【问题标题】:Python async function is never awaitedPython async 函数永远不会被等待
【发布时间】:2021-10-13 16:51:50
【问题描述】:

我在python的异步框架中实现了一个异步函数FastAPI

函数如下:

async def func2(num):
  time.sleep(3)
  return num

async def func1():
  text = await func2(5)
  print(text)
  print('inside func1')

async def my_async_func():
  print('start')
  await func1()
  print('finish')
  

在这里,当我执行 my_async_func 时,我期望异步行为和值被打印为

start
finish
inside func1
5

但它会同步打印为

start
5
inside func1
finish

如何异步处理并发操作和协程实现?

【问题讨论】:

  • 这就是await 的全部意义——它让它同步等待函数返回。
  • 你在func1()中的代码:print(text)然后print('inside func1'),你怎么能在inside func1之后实现打印5print 不是异步的。
  • 我认为等待 3 秒后,inside func1 将被打印出来。但实际上我希望在 func1 函数的延迟过程之前立即执行打印 finish 。如何获得 ? @jizhihaoSAMA @Barmar

标签: python async-await coroutine fastapi


【解决方案1】:

asyncio.create_task,(注意:你不能确保在inside func1之后按打印顺序打印5。)

试试下面的代码:

import asyncio
import time


async def func2(num):
    time.sleep(3)
    return num


async def func1():
    text = await func2(5)
    print(text)
    print('inside func1')


async def my_async_func():
    print('start')
    asyncio.create_task(func1())
    print('finish')


asyncio.run(my_async_func())

结果:

start
finish
5
inside func1

还要注意睡眠会使你的线程进入睡眠状态。

【讨论】:

  • 我会用这个。但你知道 FastAPI 函数已经是一个异步框架。不使用外部库 asyncio 就没有内置功能吗?
  • @RishadTanjim 因为 FastAPI 已经是一个异步框架,所以你可以将它与 asyncio 一起使用(asyncio 是 python 的标准模块)。
【解决方案2】:

当几个独立的(ish)任务在事件循环中轮流执行时会出现异步行为,但这里您只运行 1 个任务my_async_funcmy_async_func 然后调用func1,然后调用func2;您的程序正在按照您编写的顺序执行。

这个函数调用链实际上不应该被称为同步的,因为只有一个独立的任务。实际上,如果您将 2 个 my_async_func 任务排队,则可以看到异步行为。

【讨论】:

  • 是的,但是我该如何利用它?如果我可以期望它在并发操作之前立即打印 finish,解决方案是什么?
  • 唯一的方法是在func1调用之前移动print('finish')await func1() 表示“暂停这个协程,直到函数或协程 func1 返回之后。
猜你喜欢
  • 2019-12-15
  • 1970-01-01
  • 2021-11-10
  • 2019-09-04
  • 2020-10-08
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多