news 2026/6/26 16:42:47

Agent开发——Day 04 async/await 异步编程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Agent开发——Day 04 async/await 异步编程

Day 04 案例分析:async/await 异步编程

案例一:LLM 并发调用(最贴近 Agent 开发的场景)

场景描述

你在开发一个 Agent,用户问了一个复杂问题,你需要同时调用 3 个 LLM:

  • LLM-A:生成初稿
  • LLM-B:检查事实
  • LLM-C:评估语气

同步写法(慢):

result_a=call_llm_a(prompt)# 等 2 秒result_b=call_llm_b(prompt)# 等 2 秒result_c=call_llm_c(prompt)# 等 2 秒# 总共等 6 秒

异步写法(快):

result_a,result_b,result_c=awaitasyncio.gather(call_llm_a(prompt),call_llm_b(prompt),call_llm_c(prompt),)# 总共等 2 秒(最慢的那个)

结论:asyncio.gather()是 Agent 开发中最常用的并发工具。


案例二:FastAPI 的本质(理解"为什么框架要求 async")

FastAPI、LangGraph 的 Server 模式,都要求你写async def。原因是:

# FastAPI 路由(必须是 async def)@app.post("/chat")asyncdefchat(request:ChatRequest):# 当这里在等 LLM 响应时,FastAPI 可以去处理其他用户的请求response=awaitcall_llm(request.message)return{"reply":response}

如果用同步def,服务器处理一个用户时,其他用户的请求全部排队等待。
async def,等待 IO 的时候 CPU 可以去处理其他请求,吞吐量大幅提升。


案例三:Day 3 代码的异步改造

原始同步版本

importrequestsdefcall_api_with_auth(api_key:str,prompt:str)->str:url="https://httpbin.org/post"headers={"Authorization":f"Bearer{api_key}","Content-Type":"application/json"}body={"model":"some-model","messages":[{"role":"user","content":prompt}]}response=requests.post(url,headers=headers,json=body,timeout=10)response.raise_for_status()echo=response.json()print("服务器收到的 headers:",echo["headers"].get("Authorization"))return"调用成功"

异步改造版本(见 day004.py)

关键变化:

同步异步
import requestsimport httpximport aiohttp
defasync def
requests.post()await client.post()
直接调用函数asyncio.run(main())

关键概念速查

async def— 声明一个协程函数

asyncdefmy_function():return"结果"

调用它不会立刻执行,而是返回一个"协程对象"(承诺将来会执行)。

await— 等待协程完成

result=awaitmy_function()# 挂起当前函数,等 my_function 完成

await只能在async def函数内部使用。

asyncio.run()— 启动事件循环(程序入口)

if__name__=="__main__":asyncio.run(main())# 在同步代码中运行异步函数的唯一正确方式

asyncio.gather()— 并发执行多个协程

results=awaitasyncio.gather(task1(),task2(),task3())# results 是一个列表,顺序与传入顺序一致

asyncio.sleep()— 异步等待(不阻塞其他任务)

awaitasyncio.sleep(1)# 等1秒,但期间其他协程可以运行# 对比:time.sleep(1) 会阻塞整个程序
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/26 16:33:52

CORS安全配置实战:从漏洞原理到Nginx与Spring Boot修复指南

1. 项目概述:一次典型的CORS配置安全加固实战最近在给一个内部系统做安全审计时,遇到了一个挺典型的CORS配置问题。这个系统我们内部叫它“TongNCS”,是一个用于网络配置管理的平台。在渗透测试过程中,扫描器报出了一个“CORS原始…

作者头像 李华
网站建设 2026/6/26 16:26:37

ifconfig命令

ifconfig 是我们最常用的查看当前系统的网卡和 ip 地址信息的命令。如果你的机器上还没安装 ifconfig 命令,可以使用如下命令安装: yum install net-tools 安装成功以后,我们就可以使用 ifconfig 查看机器网卡信息了: [rootloc…

作者头像 李华
网站建设 2026/6/26 16:25:54

【信息科学与工程学】计算机科学与自动化——第二十篇 计算机体系架构 系列三 计算机体系结构01 ISA设计、流水线、超标量、缓存一致性、SIMD/GPU、乱序执行、CPU 设计、GPU设计、性能优化

一、ISA 设计 编号 类型 领域 问题 详细的数学分析 参数列表(表达式 / 范围 / 边界 / 测量) 关联知识 1 设计 ISA 指令集正交性与编码长度最小化 信息论 + 组合优化:以操作码熵 H=−∑pᵢlog₂pᵢ 为下界,约束 ∑lᵢpᵢ ≤ L_avg,Kraft 不等式 ∑2⁻ˡⁱ≤1 保…

作者头像 李华
网站建设 2026/6/26 16:25:41

【GaussDB】权限管理模型:RBAC与ABAC

在数据库安全体系中,权限管理是控制用户访问数据的核心机制。GaussDB支持多种权限控制模型,其中最常见的是基于角色的访问控制(RBAC)和基于属性的访问控制(ABAC)。二者在设计理念、灵活性和适用场景上有显著…

作者头像 李华