Appearance
并发、并行、异步、流水线:四个词不要混着用
对应视频:EP02《并发、并行、异步、流水线》
视频入口:B站 EP02 定时稿(计划公开:2026-08-10 11:08)。 对应合集:Python 并发实战:从基础模型到语音工程。 本文为视频的工程展开版,补充代码模板、排查链路、状态字段和检查清单。 最后核验:2026/08/09 08:26:33
视频用时间线解释四个概念。文章把它们放进同一张工程表,避免后面讨论线程、协程、进程、队列时语言混乱。
这张图用四个问题拆开概念:任务怎么组织、算力是否同时执行、等待时是否让出控制权、阶段之间如何协作。
阅读路线
- 先区分四个词各自回答的问题。
- 再看它们在语音流水线里的位置。
- 最后用选型表连接到 Python 工具。
四个概念
| 概念 | 回答的问题 | 典型实现 |
|---|---|---|
| 并发 | 能不能同时管理多个未完成任务 | 线程池、事件循环、任务队列 |
| 并行 | 能不能同一时刻真的执行多个任务 | 多进程、多核、GPU batch |
| 异步 | 等待时能不能让出控制权 | asyncio、异步网络库 |
| 流水线 | 复杂任务能不能拆阶段推进 | Queue、asyncio.Queue、任务状态表 |
放进语音任务里
text
多个文件同时处理 → 并发
多个转码进程同时占用 CPU → 并行
多个 ASR 请求等待服务端返回 → 异步
扫描、转码、识别、落盘分阶段 → 流水线这四个能力经常组合出现。一个成熟的批量语音系统可能用线程池扫描文件,用外部命令池转码,用 asyncio 调 ASR API,用队列连接每个阶段。
常见误解
| 误解 | 为什么错 | 正确说法 |
|---|---|---|
| 并发就是并行 | 并发可以只是同时管理任务,不一定同时执行 | 并发是组织, 并行是执行 |
| async 就一定快 | 阻塞函数会堵住事件循环 | async 适合非阻塞等待 |
| 进程池比线程池高级 | 进程池成本更高,适合 CPU 密集任务 | 先看瓶颈再选 |
| 流水线就是多线程 | 流水线重点是阶段和背压 | 队列和状态比线程数量更重要 |
工程补充:怎么把这篇用到项目里
读图方式
- 并发和并行不是一组同义词:并发是组织多个未完成任务,并行是多个计算资源同一时刻工作。
- 异步只说明等待时能让出控制权,不保证 CPU 计算更快,也不保证同步库不会堵住事件循环。
- 流水线关注阶段边界、队列容量和背压,它经常同时包含线程池、进程池和异步 API。
排查路径
- 看到“慢”时先问:它是在等待、计算,还是多个阶段互相拖住。
- 如果任务是等待型,观察连接数、timeout、响应耗时;如果是计算型,观察 CPU util 和函数热点。
- 如果阶段之间堆积,观察
qsize、每阶段吞吐和最慢 Consumer。
问题、证据和解决动作
| 问题现场 | 先查什么 | 解决动作 |
|---|---|---|
| 把网络等待叫 CPU 并行问题 | CPU 低、请求耗时长 | 用线程池或 asyncio 管等待 |
| 把 CPU 计算包进 async | 事件循环卡住、任务成批完成 | 用进程池或释放 GIL 的库隔离计算 |
| 多个阶段共用一个 worker 池 | 转码拖住 API,API 拖住落盘 | 按阶段拆池,用 Queue 连接 |
| 只说“我要异步” | 没有资源指标和等待点 | 先标注等待点,再选异步库或隔离策略 |
落地边界
- 写设计文档时把四个词分开用,避免团队在不同问题上争同一个名词。
- 一个系统可以同时是并发、局部并行、局部异步,并且整体是流水线。
实战检查清单
- 当前讨论的是任务组织,还是 CPU 同时执行。
- 当前任务是在等待,还是在计算。
- 是否存在多个阶段,且每个阶段瓶颈不同。
- 是否需要队列表达阶段之间的压力。
- 是否把“异步函数”误当成“整个系统异步”。
读完之后能完成什么
- 能准确解释并发、并行、异步、流水线的差异。
- 能把一个任务标注为等待型、计算型或多阶段流水线。
- 能为下一步工具选择提供清晰语言。
