进程、线程和协程有什么区别?
未标记
考查重点:资源隔离与执行调度。进程提供资源隔离,线程共享地址空间执行,协程由运行时挂起恢复;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 的官方定义,补充资源拥有者和轻量调度单元的区别。
相关面经
70 篇快手
AI Infra进程线程协程区别
腾讯
后台开发实习生进程、线程和协程?你说线程是调度的基本单位,那进程里必须有线程吗?
腾讯音乐
后端开发工程师CVTE
进程、线程、协程是什么,区别?
水滴公司
AI 全栈工程师我看你写用 FastAPI 做异步开发。先说一下进程、线程、协程分别是什么意思。
展开剩余 65 篇面经
水滴
AI全栈Go 中的协程和操作系统线程有什么区别?
网易云音乐
全栈开发线程和协程的核心区别是什么?
公司未注明
测试开发岗Python异步编程中async/await的底层事件循环讲一下,协程和线程的区别是什么。
字节跳动
搜广推引擎架构\- 进程、协程和线程这三个概念,你大概说一下自己的理解。
智元机器人、字节跳动
进程线程协程的区别、多核处理器中两个线程之间如何控制的
字节跳动
AI 应用工程师为什么用协程?协程和线程的区别?
腾讯云
后台开发工程师4.1 进程与线程区别?听过协程吗?
水滴
测试开发线程和进程、协程的区别?
字节跳动
前端开发工程师进程、线程和协程的区别
蚂蚁集团
线程和协程的区别?
字节跳动、米哈游、哔哩哔哩、百度、美团、智驾新程、CVTE
百度
云平台开发线程协程进程
百度
搜索后端开发goroutine和线程进程有什么差异,分别有什么使用场景
字节跳动
水滴
质量保障工程师(AI)哔哩哔哩、百度、腾讯
进程、线程、协程分别是什么?哪个是资源分配单位、哪个是调度单位?
金山软件
AI 全栈开发工程师网易
测试开发工程师python中的线程,进程,协程区别,有线程了为什么还要有协程
微步在线
Java 开发工程师用户态线程或者协程为什么可以减少切换的成本?你有了解过协程吗?
货拉拉
AI 应用开发工程师你提到了异步编程是吧,你知道线程和协程的区别吗?
百度
后端开发工程师(AI / Agent 方向)协程和线程的区别是啥
百度
Agent 应用开发工程师说一下进程、线程、协程的区别?
百度
后端开发工程师4 进程 线程 协程 项目工作里怎么使用的
宇树科技
嵌入式 AI 工程师进程和线程的区别,推理任务你会开线程还是单独进程
拼多多
AI Agent14\. 进程、线程和协程有什么区别?它们分别适合处理什么任务?
CVTE
AI 应用开发介绍一下进程和线程
深信服
Agent 开发进程、线程、协程的区别?
千寻智能
平台开发工程师线程协程区别
百度
Agent 开发他问我线程和协程是咋样的介绍一下
字节跳动
后端开发工程师线程池一般怎么控制参数? 你知道协程吗?
百度
后端开发2 进程、线程、协程 区别?多进程之间的通信方式?
360
全栈开发工程师协程跟线程的区别
深信服
AI开发实习阿里巴巴
AI 应用算法工程师进程/线程/协程的区别
腾讯
AI 应用开发工程师你的主要开发语言是什么?请比较进程、线程和协程的区别,并说明单线程多协程模型能否有效利用多核CPU资源。
字节跳动
AI 应用开发工程师除了进程和线程,还有协程。协程和进程、线程有什么区别?
联影
Agent 开发工程师进程、线程和协程有什么区别?分别适合什么场景?
腾讯
AI 应用开发进程、线程跟协程有什么区别?
字节跳动
后端开发进程线程协程。可以说一下区别吧。
货拉拉
后端开发工程师进程、线程、Go协程有什么区别
快手、金山云、蔚蓝云创、深势科技、滴滴
进程跟线程的区别
阿里巴巴
游戏服务端开发进程,线程,协程
公司未注明
后端开发工程师5线程和进程区别
美团
全栈开发工程师进程线程协程
字节跳动
后端开发协程比起线程有什么优势?
腾讯
后台开发你了解协程吗?
滴滴
Agent腾讯
AI 应用开发实习生说一下线程、进程还有协程他们的一些区别概念。
百度
智能体开发协程、进程、线程区别
腾讯
后台开发了解协程吗
蚂蚁集团
研发效能工程师线程、进程、协程解释(这个真不会,举了个例子来说我在业务遇到这几个概念)
字节跳动
公司未注明
Go 后端开发goroutine 和线程的区别
字节跳动
Go 后端开发换了个问法:goroutinue和线程的区别
腾讯
后端开发工程师什么是协程,进程,线程
腾讯
后端开发协程的特点
小红书
全栈开发进程、线程、协程区别
腾讯
AI 应用开发线程跟协程的区别
阿里巴巴
AI 应用研发实习生进程,线程,协程的区别以及用途
字节跳动
AI 开发什么是协程,它和线程有什么区别?
KK集团
Java开发什么所谓的虚拟线程啊?什么协程啊?它跟我们传统的什么线程和进程有什么区别?
百度
AI Infra进程协程线程
哔哩哔哩
机器学习研发实习生系统基础:进程/线程/协程概念
字节跳动
AI 开发工程师协程定义
tuitti视界之外
Agent 平台开发工程师协程和线程有什么区别?
















