J'Blog

15 课 · 进阶

语义检索

基于 Chroma 向量库,与 Workspace 知识库分离。用自然语言描述你想查的内容。 非管理员每人每天可检索 5 次(消耗站点 AI 配额)。

异步编程与并发控制

原文:asyncio 异步

一句话

使用async/await语法实现高效异步I/O和并发编程

什么时候翻这页

  1. 需要实现Agent中的异步工具调用,避免阻塞主线程
  2. Agent需要同时处理多个API请求或数据库查询
  3. 开发需要长时间运行的后台任务,如定期检查工具更新
  4. 构建需要高并发处理的Agent服务端

核心概念

  1. 协程(Coroutine):使用 async/await 语法定义的函数,可以暂停执行并在之后恢复
  2. 事件循环(Event Loop):asyncio 的核心,负责运行协程和处理事件
  3. 任务(Task):对协程的封装,可以并发执行并跟踪其状态
  4. Future:表示异步操作最终结果的对象
  5. 传输(Transports):处理 I/O 操作的底层机制
  6. 协议(Protocols):定义传输如何工作的规则

怎么做

  1. 创建异步函数:
async def main():
    print('Hello ...')
    await asyncio.sleep(1)
    print('... World!')
  1. 运行异步函数:
asyncio.run(main())
  1. 在 REPL 中使用 asyncio:
$ python -m asyncio
>>> import asyncio
>>> await asyncio.sleep(10, result='hello')
'hello'
  1. 并发执行多个任务:
async def task1():
    await asyncio.sleep(1)
    return "Task 1 done"

async def task2():
    await asyncio.sleep(2)
    return "Task 2 done"

async def main():
    results = await asyncio.gather(task1(), task2())
    print(results)

asyncio.run(main())

命令 / API 速查

API描述
asyncio.run(main())运行主协程
await asyncio.sleep(delay)异步休眠指定秒数
asyncio.create_task(coro)创建任务
asyncio.gather(*coros)并发执行多个协程
asyncio.Queue()异步队列
asyncio.Lock()异步锁
asyncio.Event()异步事件

与 Agent 开发的联系

  1. Agent 开发中常需要异步调用外部 API 或工具,asyncio 可实现非阻塞调用
  2. 当 Agent 需要同时处理多个用户请求时,asyncio 提供的高并发能力至关重要
  3. 在构建需要长时间运行的 Agent 服务时,asyncio 的任务管理和事件循环机制可确保系统稳定性

初学者易错点

  1. 忘记在异步函数中使用 await 关键字
  2. 在异步函数中使用阻塞式 I/O 操作,导致事件循环阻塞
  3. 混用同步和异步代码,造成死锁或性能问题
  4. 忽略异常处理,导致异步任务中的错误未被捕获
  5. 不正确地管理任务生命周期,导致资源泄漏

相关词条

  • library-asyncio-tasks 任务管理与调度
  • library-asyncio-streams 流式数据处理
  • library-asyncio-queues 异步队列与消息传递
  • library-asyncio-synchronization 异步同步原语
  • library-asyncio-subprocess 异步子进程管理

官方原文:https://docs.python.org/zh-cn/3/library/asyncio.html