进程、线程、协程
进程(Process)
- 操作系统为程序分配资源(CPU、内存、文件句柄等)的最小单位。每个进程都有独立的地址空间(代码段、数据段、堆栈),进程间完全隔离,互不干扰。
特点:
- 资源独立:进程有自己的内存空间,一个进程崩溃不会影响其他进程(隔离性强);
- 调度方式:由操作系统内核(进程调度器)负责调度,采用「抢占式调度」(OS 强制分配 CPU 时间片);
- 切换成本高:上下文切换需保存 / 恢复整个进程的状态(地址空间、寄存器、PCB 等),耗时毫秒级;
- 通信复杂:进程间无法直接访问对方内存,需通过「IPC(进程间通信)」机制:管道、消息队列、共享内存、Socket 等。
线程(Thread)
- 操作系统CPU 调度和执行的最小单位,隶属于进程,共享所属进程的所有资源(内存、文件句柄等)。
特点:
- 资源共享:同一进程下的线程共享进程地址空间,无需 IPC,直接读写共享变量(通信简单);
- 独立部分:每个线程有自己的栈(保存函数调用栈)和程序计数器(PC,记录下一条执行指令);
- 调度方式:由操作系统内核(线程调度器)负责,同样是「抢占式调度」;
- 切换成本中等:上下文切换无需切换地址空间,仅需保存 / 恢复线程的栈和 PC,耗时微秒级(比进程快 10-100 倍);
- 同步需求:线程间共享资源可能导致「竞态条件」(比如两个线程同时修改一个变量),需通过锁(互斥锁、条件变量)、信号量等同步机制解决。
协程(Coroutine)
- 用户态的轻量级线程(又称 “微线程”),不由操作系统调度,而是由程序(用户态调度器)主动控制切换,本质是 “协作式调度”。
特点
- 依附线程:协程必须运行在单个线程中,共享该线程的资源(无法直接利用多 CPU);
- 调度方式:用户态主动调度(协作式),通过 yield(Python2)、await(Python3)等关键字主动让出 CPU,切换到其他协程;
- 切换成本极低:无需陷入内核态,仅切换用户态的栈、PC 和寄存器,耗时纳秒级(是线程的 1/1000 甚至更低);
- 依赖支持:需语言或框架原生支持(如 Python 的asyncio、Go 的goroutine、C++ 的boost.coroutine);
- 无锁并发:同一线程内的协程切换不会有竞态条件(单线程串行执行),无需加锁。
例如:Python 中用 async def 定义的协程函数,通过 asyncio.run() 启动;
核心概念总览
| 单元 | 本质定位 | 核心特点 |
|---|---|---|
| 进程 | 操作系统资源分配的最小单位 | 独立资源、隔离性强、切换成本高 |
| 线程 | 操作系统CPU 调度的最小单位 | 共享进程资源、切换成本中等 |
| 协程 | 用户态轻量级线程 | 共享线程资源、切换成本极低 |
三者的层级关系
进程(资源容器) → 包含多个线程(CPU调度单元) → 每个线程包含多个协程(用户态轻量执行单元)
- 资源占用:进程 > 线程 > 协程;
- 切换成本:进程 > 线程 > 协程;
- 并发能力:协程 > 线程 > 进程;
- 隔离性:进程 > 线程 = 协程(线程 / 协程无隔离)
常见误区:
- “协程比线程快” 是错的?
不是 “执行速度快”,而是 “切换成本低”。协程的执行速度和线程一致(都是 CPU 执行指令),但高并发场景下,协程因切换成本低,整体吞吐量远高于线程。 - 多线程一定比多进程好?
不一定。线程共享资源需处理同步问题(锁、死锁风险),且受 GIL(如 Python)限制,CPU 密集型任务中多线程无法并行,此时多进程更优。 - 协程可以利用多 CPU 吗?
不能直接利用。协程运行在单个线程中,若要利用多核,需配合多进程(如每个 CPU 核心启动一个进程,每个进程内运行多个协程)。Go 的goroutine例外(runtime 自动调度到多线程)。 - 进程间通信一定比线程间复杂?
是的。进程隔离导致无法直接访问内存,需通过IPC机制,而线程可直接读写共享变量(但需同步)。
总结:
- 进程是“资源容器”,负责隔离和分配资源;
- 线程是“CPU 调度单元”,负责执行任务;
- 协程是“用户态轻量线程”,负责高效处理高并发IO。
选择的核心原则: - CPU 密集型 → 多进程;
- IO 密集型(高并发) → 协程(或协程 + 多进程)。
注意:
- 只有python这门语言(除了c),才会让我们开启进程,其他像java,go 一般都不开启进程
- python中为什么开进程?
-- 因为cpython解释器,不能利用多核优势--->不能利用多核优势的原因在gil锁
-- 其他语言中开启多线程,如果是多核cpu,能实现并行效果,肯定并发
-- 其他语言开启多线程,就能利用多核优势

浙公网安备 33010602011771号