进程、线程和协程有什么区别?

考查重点:资源隔离与执行调度。进程提供资源隔离,线程共享地址空间执行,协程由运行时挂起恢复;I/O 等待适合协程,CPU 并行仍需执行资源

本题目录

参考答案

核心回答

进程侧重资源与隔离,线程是进程内的执行流,协程是由程序或运行时组织的可挂起、可恢复任务。 三者主要从资源边界、调度方式和使用场景区分:

  • 进程:通常有独立虚拟地址空间,持有文件、权限等资源,进程之间通过管道、Socket、共享内存等方式通信。隔离性较强,适合独立服务或需要隔离的计算任务。
  • 线程:同一进程内共享堆、代码和打开的文件等资源,各自保存栈、寄存器等执行现场。内核线程由操作系统调度,可以在多核上并行;共享数据时需要同步,避免竞态。
  • 协程:在一个或多个线程上由语言运行时或库调度,等待合适的 I/O 操作时可挂起,让承载线程执行其他任务。它通常比为每个请求建立一个系统线程更轻,适合大量等待网络、模型或数据库响应的场景;具体调度和并行能力取决于实现。

以 Python asyncio 为例,同一事件循环一次执行一个任务,任务真正等待尚未完成的异步操作时,循环可推进其他任务。这能提高 I/O 并发承载能力,但不会让同一线程上的多段 CPU 计算同时运行。

先看资源归谁,再看执行怎样切换:进程有各自的地址空间,线程共享进程资源但保留自己的执行状态;底部用 Python asyncio 展示任务 A 等待 I/O 时,事件循环如何推进任务 B。

进程独立工作间、线程共享资源柜和各自执行现场,以及单线程asyncio等待时推进其他任务的场景

从资源与调度看三者的关系

一个进程中可以有多个线程,一个线程上的事件循环又可以管理多个协程任务。协程并没有绕开线程直接占用 CPU;操作系统仍调度实际承载它们的内核执行单元。

比较角度 进程 线程 协程/轻量任务
资源边界 默认独立地址空间,隔离较强 同进程共享多数资源 通常共享承载进程的资源,不提供进程级隔离
执行状态 包含进程资源与线程执行现场 各自有栈、寄存器等现场 保存挂起后恢复所需状态,形式依运行时而异
调度者 内核安排进程内的可运行线程 内核线程由操作系统调度 程序、事件循环或语言运行时
通信 通常需显式 IPC 可读写共享对象,但需同步 可用共享对象、队列或消息,也可能存在逻辑竞争
主要代价 创建、隔离与跨进程通信 栈、调度与共享数据同步 任务状态、运行时调度与非阻塞 I/O 配合

跨进程切换可能涉及地址空间与缓存局部性的变化;同一进程内的线程通常不需要更换地址空间;用户态轻量任务切换又可减少部分内核调度工作。但实际成本受运行时、栈、锁竞争、内存和任务数量影响,不能给三者套一个固定的性能倍数。

为什么协程适合 I/O 等待?

假设一个研搜服务同时处理网页搜索和模型请求。请求发出后,大量时间可能花在等远端响应。若每个请求都阻塞一个线程,线程数量和栈内存会随等待任务增加;异步客户端则可以让任务挂起,由事件循环在响应到来后继续执行。

这样重叠的是等待时间,并非把所有计算同时放到一个核心上运行。实际仍要限制并发数、连接数和外部接口速率,防止一次创建太多任务耗尽连接或触发限流。

使用协程还需要链路配合:在 async def 内直接调用阻塞式网络库、长时间计算或 time.sleep(),仍会占住事件循环线程。可以采用异步接口,或把适合的阻塞 I/O 移到线程池;需要多核计算时,再根据运行时选择进程池、线程池或其他并行计算方案。

怎样选进程、线程或协程?

需要强隔离或独立生命周期时,优先考虑进程。例如独立服务、容易崩溃的第三方处理程序,或适合分片的计算任务。进程池能复用工作进程,但任务和结果的序列化、传输仍有成本。

已有同步阻塞接口,需要共享进程内数据时,可以用有边界的线程池承接。例如调用只有同步接口的 I/O 库,同时控制最大并发、超时和共享数据的访问。

大量可异步等待的 I/O适合协程。模型流式请求、网络检索、消息消费等可以在等待期间让出执行机会。若真正瓶颈在计算、数据库连接或外部服务限额,增加协程数量并不能自动提高吞吐。

这些方式可以组合:多个服务进程提供隔离与多核承载,每个进程运行事件循环,必要时把阻塞函数交给受控线程池。选择应围绕任务和瓶颈,而不是只追求创建更多执行单元。

常见追问

有 await 就一定会切换任务吗? 不一定。可等待对象如果已经就绪,执行可能直接继续;如果整段代码一直计算,或只等待立即完成的操作,也不能指望它自动给其他任务充分运行机会。asyncio 的协作调度依赖真正的挂起点。

单线程协程还需要考虑并发安全吗? 需要。一个任务读取共享状态后,在等待期间另一个任务可能修改它,前者恢复后依据旧状态写回,仍会产生逻辑竞争。应缩小共享可变状态,必要时使用适合该运行时的锁或队列;阻塞式线程锁不能随意跨异步等待持有。

线程一定比协程更差吗? 不是。线程可以承接同步阻塞库,也可以利用多核执行计算,实际还取决于语言和运行时。以 CPython 为例,启用 GIL 的常规构建与 free-threaded 构建在 Python 代码的多线程并行能力上不同;释放 GIL 的扩展又有自己的情况,不能把某一种模式的结论推广到所有线程。

一个线程出错,一定导致整个进程退出吗? 要看错误类型。未处理的语言级异常可能只终止该线程;非法内存访问等进程级故障则可能导致整个进程退出。共享内存意味着错误也可能破坏其他线程依赖的数据,进程边界通常提供更强隔离。

对应教程

参考资料

相关面经

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 平台开发工程师
实习一面
查看原面经 →
追问
协程和线程有什么区别?

收录题集

3 个来源,共5 份题集

相关题目

4 题