恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

ADK Python 异步与并发风格指南:单事件循环下的 I/O 纪律与线程池实践

  • 首页
  • 资讯中心
  • /
  • ADK Python 异步与并发风格指南:单事件循环下的 I/O 纪律与线程池实践

相关资讯

数据积木化架构:构建灵活高效的数据管理体系 2026/9/13 19:57:29
Qwen3.5开源模型:397B参数MoE架构解析与部署实践 2026/9/13 19:57:29
华为AC替换AP完整指南:CAPWAP注册、转发模式与排障实战 2026/9/13 19:52:29

最新资讯

GoFr 集成 MongoDB:插拔式文档数据库接入与可观测性实战指南
Argo CD 如何开启 Orphaned Resources 监控并定位未纳管资源
Qwen Code 无头模式如何用 --json-schema 让最终回答输出符合指定 JSON Schema 的结构化结果?
Transformer 与大语言模型:第5章 Attention 的思想
Transformer 与大语言模型:第6章 Self-Attention自注意
PDFPatcher:5 分钟解除 PDF 复制与打印限制

今日推荐

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化
Flutter应用改名全指南:从Android到iOS的配置与工具实践

本周热门

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化
Flutter应用改名全指南:从Android到iOS的配置与工具实践

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

ADK Python 异步与并发风格指南:单事件循环下的 I/O 纪律与线程池实践

发布时间:2026/9/13 19:57:29
ADK Python 异步与并发风格指南:单事件循环下的 I/O 纪律与线程池实践 ADK Python 异步与并发风格指南单事件循环下的 I/O 纪律与线程池实践【免费下载链接】adk-pythonAn open-source, code-first Python toolkit for building, evaluating, and deploying sophisticated AI agents with flexibility and control.项目地址: https://gitcode.com/GitHub_Trending/ad/adk-python本文是 Google ADKAgent Development Kit代码库风格体系中关于异步与并发的核心参考文档.agents/skills/adk-style/references/async.md的深度展开。它面向所有为 ADK 编写或修改源码、工具的开发者阐述一条硬性纪律ADK 的整个执行模型建立在单一 asyncio 事件循环之上任何同步阻塞调用都会拖垮所有并发运行的 Agent而不只是调用者本身。读完本文你将掌握三条可操作的异步写作原则I/O 放入async def、绝不阻塞事件循环、用asyncio.to_thread包裹同步 I/O并理解 ADK 源码中工具执行线程池、并行 Agent 编排等底层机制如何践行这些原则。背景为什么 ADK 对异步如此“苛刻”在 ADK 中异步不是可选优化而是架构前提。从 Runner 入口 的源码可以看到Runner提供两个入口run_async(...)runners.py#L1030真正的异步主入口返回AsyncGenerator[Event, None]生产环境使用run(...)runners.py#L912同步包装器源码注释明确写着“This sync interface is only for local testing and convenience purpose. Consider usingrun_asyncfor production usage.”它内部会create_thread启动一个后台线程并调用asyncio.run再把事件跨线程搬运回调用方。也就是说同步形态只是为了本地调试的便利而存在。在实际运行中一个 Agent 进程、一次多 Agent 协作、一次 Live 流式会话都共享同一个事件循环。风格指南.agents/skills/adk-style/SKILL.md把“Anything that performs I/O — network, disk, database”明确指向 async 参考文档只要涉及网络、磁盘、数据库就必须先过异步这一关。原则一I/O 属于async def风格指南的第一条是I/O belongs inasync def网络调用、文件系统访问、数据库查询、子进程等待全部放进 async 函数。原因是 ADK 的 Agent 运行时、事件队列、Live 双向流、工具调用管道都跑在同一个事件循环里。async def函数在await处主动让出控制权事件循环才能去驱动其他 Agent、其他工具或 I/O 就绪回调而同步函数一旦执行 I/O整个循环被卡住所有并发 Agent 的响应都会出现无差别的延迟。这一点在工具层体现得最直接ADK 的工具基类BaseTool的核心契约就是异步方法run_async(args..., tool_context...)见 工具调用实现 中的_call_tool_async。即使是普通函数包装成的FunctionTool其内部调用路径function_tool.py#L319 的_invoke_callable也会通过inspect.iscoroutinefunction(target)区分同步/异步可调用对象异步函数直接await同步函数则走隔离的线程执行通道详见下文原则三。原则二不要阻塞事件循环风格指南明确禁止在异步代码中出现以下模式同步 HTTP 客户端如requests而非aiohttp/httpx.AsyncClienttime.sleep应使用await asyncio.sleep阻塞式文件读取如直接用open().read()处理大文件其他任何会长时间占用事件循环线程的调用。理由与前文一致time.sleep或同步requests.get会让整个事件循环停止调度此时其他 Agent 的 LLM 请求、正在进行的工具回调、Live 模式的流式事件全部排队等待。在并发场景下这种延迟往往表现为“莫名其妙”的卡顿——因为错误不在数据或模型而在事件循环被某个同步调用占住了。原则三用asyncio.to_thread包裹同步 I/O当某个库只提供同步 API如open()、pathlib、大多数云 SDK 客户端时风格指南给出的标准做法是把它丢进线程池执行。指南附带的示例async def save_data(path: Path, data: bytes) - None: # Wrap the blocking write so the event loop stays free. await asyncio.to_thread(path.write_bytes, data)asyncio.to_thread会把path.write_bytes(data)提交到事件循环的默认执行器线程池中运行await让出控制权事件循环继续处理其他任务写盘完成后再恢复协程。仓库中的真实应用这一模式在 ADK 源码中大量落地可以作为编写自己代码时的范本本地文件环境src/google/adk/environment/_local_environment.pyread_file/write_file内部实现为return await asyncio.to_thread(self._sync_read, resolved)与await asyncio.to_thread(self._sync_write, resolved, content)把同步的open/pathlib读写隔离开MCP 会话凭据刷新src/google/adk/tools/mcp_tool/mcp_session_manager.pyawait asyncio.to_thread(self._refresh_sync)将同步的 OAuth 凭据刷新丢到线程避免阻塞工具管道同文件中await asyncio.to_thread(...)也被用于获取同步凭据对象同文件第 823 行。源码纵深ADK 如何守护事件循环——工具线程池机制除了要求开发者写异步代码ADK 运行时本身也为“意外出现的同步工具”准备了兜底机制这是理解整套异步纪律的关键。在 工具执行实现 中_call_tool_in_thread_pool负责把工具调用搬离事件循环_get_tool_thread_pool(max_workers4)L112-L135按“事件循环 线程数”维护一个专用的ThreadPoolExecutor线程名前缀adk_tool_executor并在事件循环被回收时通过weakref.finalize自动关闭。工具专用线程池的意义在于阻塞型工具不会与事件循环默认执行器中的任务如 DNS 解析争抢线程对于同步的FunctionTool工具自身的校验、鉴权、确认逻辑仍留在调用方循环只有同步可调用对象本身进入线程池通过contextvars.copy_context()保留上下文变量快照保证跨线程调用时上下文不丢失对于其他工具则把完整的run_async契约放到工作线程中的新事件循环里执行asyncio.run。这段实现还给出了一条重要的工程提醒见 L166-L167 的注释由于 Python GIL 的存在线程池对纯 CPU 密集型 Python 代码没有帮助——它只在 GIL 被释放的场景阻塞 I/O、C 扩展下有效。因此CPU 密集计算不应依赖线程池“救火”而应从一开始就以async def 合适的调度方式设计。并发编排的底层实践TaskGroup 与 create_task异步纪律不仅约束“单个函数怎么写”还决定“多个任务怎么并行”。在 ADK 的ParallelAgent并行 Agent实现src/google/adk/agents/parallel_agent.py中Python 3.11 使用asyncio.TaskGroup并发消费多个子 Agent 的AsyncGenerator并通过asyncio.Queue加asyncio.Eventresume_signal实现背压——每个子 Agent 产出一个事件后必须等上游消费者处理完才继续避免事件积压Python 3.10 兼容路径_merge_agent_run_pre_3_11用asyncio.create_taskasyncio.gather(*tasks, return_exceptionsTrue)复刻同样的语义并保证取消时先cancel()再gather防止“generator is already running”这类并发错误。类似地Live 双向流模式在 Runner 中通过asyncio.create_task(_pump_agent_events())/asyncio.create_task(_pump_queued_events())并行驱动两个事件泵runners.py#L1675-L1676。这些实现共同印证了风格指南的底层前提整个 ADK 是构建在单个事件循环上的协作式并发系统每个协程都必须自觉地在await处让出控制权。为什么“没有 hook 检查”把异步纪律留在 Review 里风格指南最后特别强调No hook checks this—— 没有 lint 钩子或 CI 检查能拦截“异步代码里出现同步阻塞调用”这类问题。一个阻塞调用能顺利通过 CI然后在并发压力下才暴露为难以解释的延迟。这意味着异步纪律无法靠工具自动兜底只能靠两条途径保证代码评审把关Reviewer 需要逐行确认新增的 I/O 是否走async defawait是否误用了time.sleep、同步 HTTP 客户端或阻塞文件读取风格规范内化把async.md当作 I/O 相关改动的前置阅读材料从源头写出不阻塞事件循环的代码。速查清单把本文浓缩为一条可对照的检查清单适用于为 ADK 贡献代码或自研 Agent 工具时自检场景✅ 正确做法❌ 禁止做法任何网络请求异步客户端httpx.AsyncClient、aiohttpawait调用同步requests.get延迟/等待await asyncio.sleep(...)time.sleep(...)文件读写await asyncio.to_thread(path.write_bytes, ...)或 async API在async def中直接阻塞读大文件数据库查询异步驱动 await同步驱动阻塞查询子进程asyncio.create_subprocess_execsubprocess.run阻塞等待纯 CPU 计算认识到线程池无效从设计上避免在循环内做重计算依赖to_thread拯救 CPU 密集代码这套纪律的最终目标非常朴素让每一个 Agent、每一条 Live 流、每一次并行工具调用都共享同一个事件循环却互不拖累。做到这一点ADK 应用在并发场景下的延迟才真正可控、可解释。【免费下载链接】adk-pythonAn open-source, code-first Python toolkit for building, evaluating, and deploying sophisticated AI agents with flexibility and control.项目地址: https://gitcode.com/GitHub_Trending/ad/adk-python创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号