进程、线程和协程有什么区别?
未标记
考查重点:资源隔离与执行调度。进程提供资源隔离,线程共享地址空间执行,协程由运行时挂起恢复;I/O 等待适合协程,CPU 并行仍需执行资源
本题目录
参考答案
核心回答
进程侧重资源与隔离,线程是进程内的执行流,协程是由程序或运行时组织的可挂起、可恢复任务。 三者主要从资源边界、调度方式和使用场景区分:
- 进程:通常有独立虚拟地址空间,持有文件、权限等资源,进程之间通过管道、Socket、共享内存等方式通信。隔离性较强,适合独立服务或需要隔离的计算任务。
- 线程:同一进程内共享堆、代码和打开的文件等资源,各自保存栈、寄存器等执行现场。内核线程由操作系统调度,可以在多核上并行;共享数据时需要同步,避免竞态。
- 协程:在一个或多个线程上由语言运行时或库调度,等待合适的 I/O 操作时可挂起,让承载线程执行其他任务。它通常比为每个请求建立一个系统线程更轻,适合大量等待网络、模型或数据库响应的场景;具体调度和并行能力取决于实现。
以 Python asyncio 为例,同一事件循环一次执行一个任务,任务真正等待尚未完成的异步操作时,循环可推进其他任务。这能提高 I/O 并发承载能力,但不会让同一线程上的多段 CPU 计算同时运行。
先看资源归谁,再看执行怎样切换:进程有各自的地址空间,线程共享进程资源但保留自己的执行状态;底部用 Python asyncio 展示任务 A 等待 I/O 时,事件循环如何推进任务 B。
从资源与调度看三者的关系
一个进程中可以有多个线程,一个线程上的事件循环又可以管理多个协程任务。协程并没有绕开线程直接占用 CPU;操作系统仍调度实际承载它们的内核执行单元。
| 比较角度 | 进程 | 线程 | 协程/轻量任务 |
|---|---|---|---|
| 资源边界 | 默认独立地址空间,隔离较强 | 同进程共享多数资源 | 通常共享承载进程的资源,不提供进程级隔离 |
| 执行状态 | 包含进程资源与线程执行现场 | 各自有栈、寄存器等现场 | 保存挂起后恢复所需状态,形式依运行时而异 |
| 调度者 | 内核安排进程内的可运行线程 | 内核线程由操作系统调度 | 程序、事件循环或语言运行时 |
| 通信 | 通常需显式 IPC | 可读写共享对象,但需同步 | 可用共享对象、队列或消息,也可能存在逻辑竞争 |
| 主要代价 | 创建、隔离与跨进程通信 | 栈、调度与共享数据同步 | 任务状态、运行时调度与非阻塞 I/O 配合 |
跨进程切换可能涉及地址空间与缓存局部性的变化;同一进程内的线程通常不需要更换地址空间;用户态轻量任务切换又可减少部分内核调度工作。但实际成本受运行时、栈、锁竞争、内存和任务数量影响,不能给三者套一个固定的性能倍数。
为什么协程适合 I/O 等待?
假设一个研搜服务同时处理网页搜索和模型请求。请求发出后,大量时间可能花在等远端响应。若每个请求都阻塞一个线程,线程数量和栈内存会随等待任务增加;异步客户端则可以让任务挂起,由事件循环在响应到来后继续执行。
这样重叠的是等待时间,并非把所有计算同时放到一个核心上运行。实际仍要限制并发数、连接数和外部接口速率,防止一次创建太多任务耗尽连接或触发限流。
使用协程还需要链路配合:在 async def 内直接调用阻塞式网络库、长时间计算或 time.sleep(),仍会占住事件循环线程。可以采用异步接口,或把适合的阻塞 I/O 移到线程池;需要多核计算时,再根据运行时选择进程池、线程池或其他并行计算方案。
怎样选进程、线程或协程?
需要强隔离或独立生命周期时,优先考虑进程。例如独立服务、容易崩溃的第三方处理程序,或适合分片的计算任务。进程池能复用工作进程,但任务和结果的序列化、传输仍有成本。
已有同步阻塞接口,需要共享进程内数据时,可以用有边界的线程池承接。例如调用只有同步接口的 I/O 库,同时控制最大并发、超时和共享数据的访问。
大量可异步等待的 I/O适合协程。模型流式请求、网络检索、消息消费等可以在等待期间让出执行机会。若真正瓶颈在计算、数据库连接或外部服务限额,增加协程数量并不能自动提高吞吐。
这些方式可以组合:多个服务进程提供隔离与多核承载,每个进程运行事件循环,必要时把阻塞函数交给受控线程池。选择应围绕任务和瓶颈,而不是只追求创建更多执行单元。
常见追问
有 await 就一定会切换任务吗? 不一定。可等待对象如果已经就绪,执行可能直接继续;如果整段代码一直计算,或只等待立即完成的操作,也不能指望它自动给其他任务充分运行机会。asyncio 的协作调度依赖真正的挂起点。
单线程协程还需要考虑并发安全吗? 需要。一个任务读取共享状态后,在等待期间另一个任务可能修改它,前者恢复后依据旧状态写回,仍会产生逻辑竞争。应缩小共享可变状态,必要时使用适合该运行时的锁或队列;阻塞式线程锁不能随意跨异步等待持有。
线程一定比协程更差吗? 不是。线程可以承接同步阻塞库,也可以利用多核执行计算,实际还取决于语言和运行时。以 CPython 为例,启用 GIL 的常规构建与 free-threaded 构建在 Python 代码的多线程并行能力上不同;释放 GIL 的扩展又有自己的情况,不能把某一种模式的结论推广到所有线程。
一个线程出错,一定导致整个进程退出吗? 要看错误类型。未处理的语言级异常可能只终止该线程;非法内存访问等进程级故障则可能导致整个进程退出。共享内存意味着错误也可能破坏其他线程依赖的数据,进程边界通常提供更强隔离。
对应教程
- 深度研搜:子智能体进阶与异步执行 §4.1、§4.3~4.4:回看
astream()、asyncio.gather()和任务调度如何重叠外部调用的等待;本文补充进程、线程的资源边界与选型。
参考资料
- 国内:JavaGuide:进程与线程详解:参考资源共享、私有执行现场和轻量任务的讲解,说明三者在操作系统与运行时中的不同位置。
- 国内:JavaGuide:CPU 调度与系统负载:结合等待、抢占与上下文切换的解释,说明增加线程或任务数量为何不一定增加有效计算能力。
- 国内:小林 coding:进程、线程基础知识:借鉴线程共享资源与上下文切换的分析,比较进程隔离、线程协作和通信成本。
- 国外:Python:Coroutines and tasks:依据事件循环协作调度、Task 和线程执行的说明,解释协程如何等待与恢复,以及阻塞函数为什么需要额外处理。
- 国外:Microsoft:About Processes and Threads:依据进程资源、线程执行现场与 fiber 的官方定义,补充资源拥有者和轻量调度单元的区别。
相关面经
35 篇腾讯
后台开发实习生进程、线程和协程?你说线程是调度的基本单位,那进程里必须有线程吗?
腾讯音乐
后端开发工程师CVTE
进程、线程、协程是什么,区别?
水滴公司
AI 全栈工程师我看你写用 FastAPI 做异步开发。先说一下进程、线程、协程分别是什么意思。
水滴
AI全栈Go 中的协程和操作系统线程有什么区别?
展开剩余 30 篇面经
公司未注明
测试开发岗Python异步编程中async/await的底层事件循环讲一下,协程和线程的区别是什么。
字节跳动
搜广推引擎架构\- 进程、协程和线程这三个概念,你大概说一下自己的理解。
智元机器人、字节跳动
进程线程协程的区别、多核处理器中两个线程之间如何控制的
字节跳动
AI 应用工程师为什么用协程?协程和线程的区别?
腾讯云
后台开发工程师4.1 进程与线程区别?听过协程吗?
字节跳动
前端开发工程师进程、线程和协程的区别
蚂蚁集团
线程和协程的区别?
水滴
质量保障工程师(AI)金山软件
AI 全栈开发工程师网易
测试开发工程师python中的线程,进程,协程区别,有线程了为什么还要有协程
微步在线
Java 开发工程师用户态线程或者协程为什么可以减少切换的成本?你有了解过协程吗?
货拉拉
AI 应用开发工程师你提到了异步编程是吧,你知道线程和协程的区别吗?
百度
后端开发工程师(AI / Agent 方向)协程和线程的区别是啥
百度
Agent 应用开发工程师说一下进程、线程、协程的区别?
CVTE
AI 应用开发介绍一下进程和线程
深信服
Agent 开发进程、线程、协程的区别?
千寻智能
平台开发工程师线程协程区别
字节跳动
后端开发工程师线程池一般怎么控制参数? 你知道协程吗?
360
全栈开发工程师协程跟线程的区别
阿里巴巴
AI 应用算法工程师进程/线程/协程的区别
腾讯
AI 应用开发工程师你的主要开发语言是什么?请比较进程、线程和协程的区别,并说明单线程多协程模型能否有效利用多核CPU资源。
字节跳动
AI 应用开发工程师除了进程和线程,还有协程。协程和进程、线程有什么区别?
联影
Agent 开发工程师进程、线程和协程有什么区别?分别适合什么场景?
公司未注明
后端开发工程师5线程和进程区别
美团
全栈开发工程师进程线程协程
滴滴
Agent蚂蚁集团
研发效能工程师线程、进程、协程解释(这个真不会,举了个例子来说我在业务遇到这几个概念)
腾讯
后端开发工程师什么是协程,进程,线程
字节跳动
AI 开发工程师协程定义
tuitti视界之外
Agent 平台开发工程师协程和线程有什么区别?












