async 基础
同步与异步
同步的特点:一件事做完,才做下一件。等待时(比如等网络、等 API 响应),程序闲着干等,CPU 在空转。
异步的特点:遇到「要等」的操作时,先去做别的事,等结果好了再回来处理。适合 I/O 密集型任务(网络请求、读文件、调 LLM API)
关键字速查
| 关键字 | 作用 |
|---|---|
| async def | 定义协程函数(coroutine function) |
| await | 在 async 函数里等待另一个 async 操作完成 |
| asyncio.run() | 在普通脚本里启动整个 async 程序(入口) |
1. async def — 定义协程函数
asyncdeffetch_data():return"数据"调用 fetch_data() 不会立刻执行函数体,而是返回一个协程对象(coroutine object)。
2. await — 等待协程完成
asyncdefmain():result=awaitfetch_data()# 等 fetch_data 跑完,拿到返回值print(result)await 只能写在 async def 函数内部。
3. asyncio.run() — 程序入口
普通 .py 文件里没有「事件循环」,需要这样启动:
importasyncioasyncdefmain():...asyncio.run(main())# 创建事件循环,运行 main,结束后关闭4. asyncio.gather — 并发
results=awaitasyncio.gather(task_a(),task_b(),task_c())# 或 tasks = [task_a(), task_b(), task_c()] ,# results = await asyncio.gather(*tasks)- 是 Python 的可迭代对象解包(unpacking)运算符。写在函数调用里时,会把列表/元组里的元素拆开,当作多个独立参数传进去。
| 要点 | 说明 |
|---|---|
| 传入 | 多个协程(注意是 fetch_url(“a”) 这种调用,不是函数名本身) |
| 返回 | 列表,按传入顺序对应各任务返回值 |
| 执行 | 事件循环同时调度,在 await 等待处切换 |
5. 测量耗时:time.perf_counter()
对比顺序和并发,需要计时:
importtime start=time.perf_counter()# performance counter 的缩写,意思是 性能计数器# ... 执行任务 ...elapsed=time.perf_counter()-startprint(f"耗时:{elapsed:.2f}秒")