当前位置:首页 > AI技术 > 正文内容

异步编程如何获取返回值 通过await关键字等待协程执行结束完全指南|Duuu笔记

admin2个月前 (03-30)AI技术51

await后必须是可等待对象,否则报TypeError;协程函数调用返回coroutine对象,需await才执行;不可在普通函数或模块顶层直接使用await;并发需用asyncio.gather()或create_task()。

await 后面必须是可等待对象,否则报

TypeError: object X can't be used in 'await' expression

协程函数调用后返回的是一个

coroutine

对象,不是直接的值;直接 print 或赋值不会触发执行。常见错误是忘了加

await

,或者误把普通函数、列表、

None

丢给

await

✅ 正确:调用协程函数后立刻

await

,如

await fetch_data()

❌ 错误:写成

await fetch_data

(没加括号,得到的是函数对象)

❌ 错误:写成

await [1, 2]

await result

(result 是已执行完的变量,不是协程)

⚠️ 注意:

asyncio.run()

内部会自动 await 顶层协程,但函数内部仍需显式 await 子协程

async def

函数里,return 的值就是

await

的返回值

协程函数的

return

不是“返回给函数”,而是“作为 await 表达式的求值结果”。这和同步函数一致,但容易因异步表象产生误解。

return 42

,外面

val = await my_coro()

后,

val

就是

42

不写

return

,默认返回

None

await

结果也是

None

抛出异常时,

await

会直接把异常冒泡出来,和同步 raise 行为一致

示例:

async def get_user_id():

return 1001

user_id = await get_user_id() # user_id 是 int 类型,值为 1001

不能在普通函数或模块顶层直接用

await

,会报

SyntaxError: 'await' outside async function

await

是语法关键字,只允许出现在

async def

定义的函数体内。想在脚本开头、交互式环境或同步逻辑里取协程返回值,得靠事件循环驱动。

Python免费学习笔记(深入)

”;

ima.copilot

腾讯大混元模型推出的智能工作台产品,提供知识库管理、AI问答、智能写作等功能

下载

✅ 在脚本中:用

asyncio.run(main())

包一层

async

入口函数

✅ 在 IPython/Jupyter 中:启用

%autoawait

或用

await coro

(需已进入 async 模式)

❌ 直接写

await asyncio.sleep(1)

在 .py 文件最外层 —— 语法错误

⚠️ 注意:

asyncio.run()

每次调用都会新建事件循环,不能在已有运行中的 loop 里重复调用(比如 Flask 或 FastAPI 的请求处理中)

并发多个协程时,

await

单个会阻塞,要用

asyncio.gather()

asyncio.create_task()

连续写多个

await

是串行的,哪怕它们本身不互相依赖。想真正并发并收集返回值,必须把协程对象提前构造成任务,再统一 await。

❌ 串行写法(慢):

res1 = await fetch_a(); res2 = await fetch_b()

✅ 并发写法(快):

res1, res2 = await asyncio.gather(fetch_a(), fetch_b())

✅ 更灵活写法:

task1 = asyncio.create_task(fetch_a()); task2 = asyncio.create_task(fetch_b()); res1 = await task1; res2 = await task2

⚠️

gather()

遇到任一异常默认取消其余任务;如需“失败不中断”,加参数

return_exceptions=True

实际写异步代码时,最常卡住的地方不是语法,而是混淆“协程对象”和“协程返回值”——前者是待执行的计划,后者是 await 执行完才有的东西。只要盯住每个

await

右边是不是一个真正的

coroutine

对象,基本就不会掉坑里。

相关文章

Unity 机器学习 基础

ML-Agents 资产导入 Unity 场景创建 Unity 代码部分 Anaconda 执行 rollerball_config.yaml 机器学习逻辑处理...

【DL】2023年你应该知道的 10 大深度学习算法

3. 循环神经网络 (RNN) 4. 生成对抗网络 (GAN) 5. 径向基函数网络 (RBFN) 6. 多层感知器 (MLP) 7. 自组织图 (SOM)...

神经网络中的单层神经网络

神经网络是一种模拟人脑的神经网络以期能够实现类人工智能的机器学习技术。人脑中的神经网络是一个非常复杂的组织。成人的大脑中估计有1000亿个神经元之多。 看一个经典的神经网络。这是一个包...

前端开发高级应用:MuleRun如何连接Slack通知 MuleRun消息推送集成配置步骤实战案例|Duuu笔记

若MuleRun无法向Slack推送通知,需依次配置Incoming Webhook或Bot Token、在MuleRun中设置对应通知目标参数,并通过最小化任务测试验证;常见失败原因包括凭据错误、权...

AI核心技巧:如何重置openclaw硬件设置 openclaw恢复出厂设置操作方法【操作】深度解析|Duuu笔记

重置 OpenClaw 配置有四种方法:一、交互式向导重置(openclaw onboard --reset);二、指定作用域的命令行重置(如--reset-scope config);三、手动删除~...

从入门到精通:前端开发之骡子快跑支持热点借势吗 骡子快跑节日营销文案生成|Duuu笔记

骡子快跑平台提供五步节日营销文案生成路径:一、调用内置32个节日模板库;二、输入热点事件触发动态生成;三、绑定自有素材库实现个性化延展;四、多角色视角协同输出;五、接入微信生态直发并校验合规性。 ☞...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。