logo
60

异步编程

⏱️ 40分钟

异步编程(asyncio):让 I/O 任务并发推进

你现在可能会困惑什么

“async 是不是等于多线程?”

不是。asyncio 常见是单线程事件循环,通过 await 切换任务。

一句话定义

异步编程用 async/await 在等待 I/O 时切换执行,提升吞吐。

生活类比

煮面时等待水开,可以顺手洗菜;不是分身,是调度更好。

最小可运行例子

import asyncio

async def task(name, sec):
    await asyncio.sleep(sec)
    print(name)

async def main():
    await asyncio.gather(task("A", 1), task("B", 2))

asyncio.run(main())

课堂小测(5 分钟)

  1. 写两个并发 task。
  2. 比较串行与并发耗时。
  3. 给 task 加异常处理。

课堂小测参考答案与判分点

  • 参考答案方向:能写出可运行代码,并覆盖题目中的核心条件与边界输入。
  • 判分点 1(正确性):主流程结果正确,关键分支可执行。
  • 判分点 2(可读性):变量命名清晰,结构不过度嵌套。
  • 判分点 3(健壮性):对空值、类型错误或异常输入有基础保护。

迁移任务(课后)

实现并发请求 5 个 URL 的 demo 并统计总耗时。

本节验收标准

你能独立做到:

  • 解释 async/await/gather
  • 判断 I/O bound 场景
  • 避免在 async 中调用阻塞 I/O

常见报错与调试步骤(新手版)

  • 报错看不懂:先读最后一行错误类型(如 TypeErrorNameError),再回到对应代码行定位。
  • 不确定变量值:在关键位置临时 print(变量, type(变量)),先确认数据是否符合预期。
  • 改了代码却没生效:确认文件已保存、运行的是当前文件、终端环境(venv)是否正确。

常见误区

  • 误区:加 async 一定更快。
  • 正解:只有 I/O 等待明显时优势明显。