在 Python 中处理并发任务时,我们会反复碰到三个核心概念:进程、线程、协程。它们分别对应操作系统层面或应用层面的不同执行单元,理解它们的本质与差异,是后续深入 threading、multiprocessing、asyncio 等模块的前提。
进程(Process)
- 是什么:进程是操作系统资源分配的最小单位。每个进程拥有独立的内存空间、文件描述符等系统资源,进程之间互相隔离。
- Python 中的体现:通过
multiprocessing模块创建新进程。每个进程启动一个独立的 Python 解释器,拥有自己的 GIL,因此可以真正并行执行 Python 字节码。 - 优点:
- 内存隔离,一个进程崩溃不会影响其他进程。
- 能充分利用多核 CPU,绕过 CPython 的 GIL 限制。
- 缺点:
- 创建和销毁成本高,进程间通信(IPC)需要借助队列、管道、共享内存等机制,代码复杂度上升。
- 消耗系统资源多(每个进程都要一份 Python 运行环境)。
- 适用场景:CPU 密集型任务(如大量数学计算、图像处理),需要利用多核的计算能力。
线程(Thread)
- 是什么:线程是操作系统调度执行的最小单位,一个进程内可以包含多个线程,它们共享该进程的内存空间。
- Python 中的体现:通过
threading模块创建和管理线程。由于 CPython 的 GIL 限制,多个线程在执行 Python 字节码时是互斥的,任意时刻只有一个线程能执行 Python 代码。 - 优点:
- 创建开销小,共享数据方便(可直接访问进程内的全局变量)。
- 适合 IO 密集型任务,如网络请求、文件读写。因为线程在进行 IO 操作时会释放 GIL,让其他线程有机会执行。
- 缺点:
- GIL 导致在多核 CPU 上,多线程无法实现 CPU 密集型任务的并行加速。
- 共享内存带来了竞争条件和死锁风险,需要使用锁(Lock、RLock 等)进行同步。
- 适用场景:IO 密集型任务(如并发网络爬虫、Web 后端中同时处理多个请求),通过线程池高效管理。
协程(Coroutine)
- 是什么:协程是用户态的轻量级“线程”,由程序自身控制调度,而非操作系统内核。协程之间的切换不需要陷入内核态,开销极小。
- Python 中的体现:通过
asyncio模块配合async/await语法实现。协程在遇到await时主动让出执行权,事件循环接着调度其他协程。 - 优点:
- 切换成本极低,可以同时运行成千上万个协程而几乎没有额外开销。
- 单线程内执行,不存在多线程的竞争条件问题(但共享数据仍需小心)。
- 缺点:
- 必须使用支持异步的库(
aiohttp而非requests),否则同步阻塞会导致整个事件循环卡住。 - 编程模型改变,整个代码链路需要保持异步风格。
- 适用场景:高并发 IO 密集型任务,如大量并发 API 调用、长连接服务(WebSocket)、实时数据流处理。用很少的资源就能支撑海量并发。
三者对比速查表
| 特性 | 进程 | 线程 | 协程 |
| -------------- | ------------------------ | ------------------------ | -------------------- |
| 执行单元 | 独立 Python 解释器 | 进程内共享资源 | 单线程内用户态调度 |
| 内存/资源 | 独立内存空间,隔离性好 | 共享内存,隔离性差 | 共享线程内存 |
| 切换开销 | 大 | 中 | 小(微秒级) |
| 并行能力 | 可真正并行(多核) | 受 GIL 限制,无法并行 | 单线程内并发 |
| 通信方式 | Queue、Pipe、共享内存等 | 共享变量 + 锁 | 不需要锁,消息传递 |
| 适合任务类型 | CPU 密集型 | IO 密集型(传统多线程) | IO 密集型(高并发) |
| Python 模块 | multiprocessing | threading | asyncio |
现实中的选型思路
在实际项目中,选择哪种并发方案通常遵循一个简单的决策树:
- 判断任务类型:是 CPU 密集型还是 IO 密集型?
- CPU 密集型 → 用多进程(
multiprocessing或concurrent.futures.ProcessPoolExecutor),让每个核心都忙起来。 - IO 密集型但并发量不大(比如同时请求几十个接口)→ 用多线程(
ThreadPoolExecutor),代码改造少。 - IO 密集型且需要高并发(比如同时维护上万个连接)→ 用协程(
asyncio+ 异步库),用最小的硬件成本伺候最多的并发。
掌握这三个概念及其边界,就拿到了 Python 并发编程的“总地图”。后续各节我们将分别深入它们在标准库中的具体实现与实战技巧。