基础执行单元:程序 → 进程 → 线程 → 协程
1、程序 (Program)
定义:静态的代码文件,是存放在硬盘上的一堆指令集合(比如 .exe、.py、.apk)。
2、进程 (Process)
定义:进程是计算机分配资源的基本单元。程序的一次运行过程就叫进程,进程是活的,是动态的 (内存、cpu等等资源是在变化的)。每个进程有独立的内存空间,互不干扰。
特点及用途:
进程池 (Process Pool)
定义:预先创建好一批进程,重复使用,不频繁销毁重建,解决频繁创建销毁进程开销大的问题。
用途:
- 多进程并行计算:利用多核,稳定隔离,但是占用资源多
多进程的作用:提升效率,解决阻塞,在计算时CPU能得到最大限度的利用
多进程是同时运行多个独立的程序。
①利用多核 CPU,真正并行执行
多个进程可以被分配到不同 CPU 核心上同时跑,效率最大化。
②进程之间完全隔离,稳定性极高
一个进程崩溃,不会影响其他进程。适合对稳定性要求极高的系统(浏览器、数据库、游戏服务器)。
③避开 GIL 锁限制(Python 专属)
Python 多线程无法真正并行,多进程可以突破这个限制。
④独立权限、独立内存
适合需要安全隔离的场景
多个进程之间的通信
①管道(Pipe)
适用于两个进程之间的双向/单向通信(通常是父子进程或者是兄弟进程)。
特点:基于内存实现,简单高效,无需额外中间介质,但不支持多个进程同时读写(容易发生冲突)
②队列(Queue)
基于“管道 + 锁(多进程内置的互斥锁)”实现,支持多个进程之间的安全通信,是最常用的方法之一。
特点:自带进程安全保护,适合实现“生产者-消费者”模型,使用简单,无需手动处理锁冲突。
③共享内存(Value/Array)
让多个进程共享同一块内存区域,直接读写内存数据,速度最快。
特点:高效适合大量数据传输,但无内置锁保护,需要手动加锁(如 Lock)避免并发读写冲突。
④管理器(Manager)
基于“服务进程 + 客户端代理”实现,自带进程安全锁,底层依托本地网络套接字通信。支持共享复杂数据结构(字典,列表等),可以跨多个进程甚至跨机使用。
特点:功能强大,使用灵活,但基于网络通信,效率比共享内存低,适合需要共享复杂数据的场景。
⑤补充:信号/事件(同步辅助)
不传输实际数据,主要用于进程间同步(通知对方如状态变化,如“数据已准备好”)
特点:常配合其他通信方法使用,协调进程执行顺序,而非传递业务数据。
3、线程 (Thread)
定义:线程是计算机调度的基本单元。线程的作用就是用来执行代码,一个进程当中至少要有一个线程,叫做主线程,线程必须依赖进程。一个进程当中可以创建多个线程,而且这多个线程共享当前进程资源。
特点及用途:
线程池 (Thread Pool)
定义:预先创建好一批线程,重复使用,避免频繁创建线程,解决频繁创建销毁线程开销大的问题。
用途:
- 服务器处理大量请求:轻量、高效,但是受 GIL 锁限制
多线程的作用:提升效率,解决阻塞
多线程是在一个程序里,同时让多个线程干活。
①让程序不卡顿,提升用户体验
如:下载文件时,界面依然可以操作;边播放音乐边加载歌词 。
主线程管界面,子线程管耗时任务
②资源开销小、创建销毁快
线程共享内存,比进程轻量得多,系统消耗小。
③适合 I/O 密集型任务
如:网络请求、文件读写、数据库查询、等待用户输入
这些任务 CPU 大部分时间在等待,多线程能极大提升效率。
④线程间通信简单高效
因为共享内存,数据传递非常方便。
多个线程之间的通信
一般常用的有:直接共享全局变量/对象,实现简单但是没有内置线程安全保护,并发易发生错误,得手动加锁。
队列方法和多进程队列类似,内置线程互斥锁,无需手动加锁,最常用。同步原语(Event/Condition)用于协调线
程通信,不直接传递业务数据。线程之间通信的核心优势是共享进程内存,比进程通信简单高效。
4、 协程 (Coroutine)
定义:也可称为微线程,或非抢占式的多任务子例程,一种用户态的上下文切换技术(通过一个线程实现代码块间的相互切换执行)。在一个线程(协程)中,遇到io等待时间,线程可以利用这个等待时间去做其他事情。通过 “协作式调度” 实现并发,同一时刻仅一个协程执行,切换由程序主动控制(无 GIL 影响)。
特点及用途:
- 用户态调度:协程切换由 Python 程序控制(如 yield 或 await),无需操作系统介入,切换开销极小(仅保存函数上下文)
- 协作式并发:协程执行到 IO 操作或主动挂起时(await),才会切换到其他协程,避免 “抢占式调度” 的开销
- 单线程内并发:所有协程运行在同一线程中,内存共享且无需加锁(避免资源竞争),但需配合异步 IO 库使用
asyncio 模块(async/await 语法)异步IO库
asyncio是Python 标准库中用于异步编程和并发任务管理的核心库。它的基础是事件循环,用来调度协程(coroutines),让它们能够非阻塞地并发执行。这种编程模型在处理大量I/O密集型任务时非常高效,如网络操作、文件读写等。主要是控制协程的执行顺序。
事件循环
管理所有协程任务的状态(就绪 / 运行 / 挂起)。当协程挂起(如等待 IO 响应)时,切换到其他就绪协程。事件完成后,唤醒对应的协程继续执行。类似一个死循环遍历列表里面的任务,哪个可以执行哪个不可以执行,哪个可以执行就去执行。
asyncio的常用方法
async 在函数定义前面代表创建一个协程,函数调用后会返回协程,而不是直接执行 await 在协程函数中才能使用,用来等待其他异步操作的完成,也是切换协程任务执行的标志 run 启动事件循环,传入主协程 create_task() 把协程包装成并发任务,可以高并发执行这些任务 开启并发的开关 gather 并发执行多个协程任务,需要在run内部调用执行,run是启动事件循环,gather是把多个任务并发执行并收集结果(在已经启动的事件循环中) sleep 模拟异步任务中的延迟
任务执行方式:并发 vs 并行
描述多个任务如何同时运行。
1、并发 (Concurrency)
定义:一个 CPU 核心,快速切换执行多个任务,即一段时间内多个任务交替运行。
适用:IO 密集型(等待时间多)。
2、并行 (Parallelism)
定义:多个 CPU 核心,真正同时执行多个任务,即多个任务在同一时刻一起运行。
适用:CPU 密集型(计算量大)。
任务协作方式:同步 vs 异步
描述任务之间的等待关系。
1、同步 (Synchronous)
定义:任务必须排队执行,一个做完才能做下一个。
特点:简单、安全、但效率低。
用途:顺序执行的简单逻辑、数据强一致性场景。
2、异步 (Asynchronous)
定义:任务不用等待,发起后去做别的事,等结果回来再处理。
特点:高效、不阻塞、逻辑复杂。
用途:网络请求、文件读写、数据库操作等 IO 任务。
Python中如何完成函数的异步调用?
Python 中异步是“单线程非阻塞”的编程模型,核心解决 IO 密集型任务的阻塞效率问题,核心依赖“事件循环+协程”实现,底层依托生成器的暂停/恢复机制和操作系统的非阻塞 IO/IO 多路复用(select/epoll 等)。
执行逻辑:
①用 async/await 定义可暂停的协程(异步任务),注册到事件循环;
②事件循环作为总调度,执行协程时,若遇 await 等待操作,协程暂停并交还执行权,事件循环调度其他可执行协程;
③当等待的 IO 任务完成,操作系统通知事件循环,协程被标记为可恢复,后续由事件循环调度继续执行;
④直至所有协程执行完毕,事件循环终止。
特点:无线程/进程创建、切换的开销,最大化利用单线程资源;仅适用于 IO 密集型任务,CPU密集型任务更适合多进程(突破 GIL 限制)。
Python 专属限制:GIL 全局解释器锁
定义:GIL 是 Python 解释器的一种机制,其保证任意时刻仅一个线程能执行 Python 字节码。它让 Python 多线程处理 I/O 密集型任务效率尚可,但执行 CPU 密集型任务时,多核心CPU 只能发挥和单核 CPU 一样的性能。
所以由于GIL的存在,多线程只能是并发(同一时刻一个进程当中只有一个线程能执行),要实现并行,只能使用多进程,但是前提计算机cpu必须是多核。
绕过 GIL 的方式:使用多个进程,每个进程有自己的 Python 解释器和 GIL,然后多进程并行。除此之外还可以使用 Cpython 或者 C 扩展,可以释放 GIL 锁,以及 Numpy 和 SciPy等库也可以不受 GIL 限制。