公司动态

理解 Python CPU密集型 和 IO密集型任务

📅 2026/8/20 11:58:15
理解 Python CPU密集型 和 IO密集型任务
先了解CPU密集型和IO密集型任务概念然后我们根据几个问题深入理解CPU密集型和IO密集型CPU密集型/计算密集型任务大部分耗时消耗在【CPU做数学/逻辑运算】特征✅ 大量数学运算、循环、逻辑处理、数值计算✅ CPU 持续满载瓶颈CPU 算力上限✅ 极少读写文件、网络请求❌ 几乎没有阻塞等待瓶颈所在CPU 的算力和核心数IO密集型程序大部分耗时消耗在等待【外部设备】概述Input / Output 输入 和 输出程序和外部设备交换数据的所有操作就叫 IO外部设备CPU、内存 程序内部硬盘、网卡、显示器、键盘、打印机 外部设备只要数据走出 / 走进内存和外部硬件打交道全部属于 IO分类场景磁盘IO读写 txt、csv、加载模型、保存文件open()、pd.read_csv、torch.load()网络IO数据库连接、http 请求、websocket、爬虫请求接口、下载文件其他IO键盘输入、print打印、声卡读写、摄像头获取画面进程和线程处理 CPU和IO 收益和开销对比CPU 密集场景 → 多进程 收益 开销CPU 密集任务特征程序绝大部分时间持续占用 CPU 疯狂计算瓶颈 CPU 算力单核速度上限卡死程序。现状多线程受 GIL 限制再多线程也只能跑在单个 CPU 核心无法利用多核。无论开多少线程总速度几乎不变。多进程每个进程跑在不同核心实现并行。付出进程创建、内存、上下文切换的开销换来多核同时运算整体耗时大幅下降。开销成本可以被收益抵消。举个例子4 核机器一段循环计算任务单进程耗时40s4 个进程并行12s虽然进程有开销提速非常明显必须承担开销没有更好方案。IO 密集场景 → 多进程开销 收益IO 密集特征程序90% 以上时间在等待网络 / 磁盘CPU 基本空闲瓶颈不在算力在等待 IO。我们追求的仅仅是等待 A 的时候同时发起 B 的 IO 请求。实现这个目标有低成本方案多线程 / 协程这时候强行上多进程花巨大代价创建独立内存、独立解释器但根本不需要多核算力。多进程带来的 “并行能力” 完全用不上只剩下纯粹额外资源消耗属于额外负担得不偿失。结论多进程本身资源开销永远很大。CPU 密集场景下我们需要多核并行计算没有其他方案开销是必要成本而 IO 密集任务只需要并发等待不需要多核使用多进程付出高额资源成本却得不到性能增益因此不推荐思考分清楚是一个厨房一个人交替做饭还是多个厨房多个人同时做饭举个例子做一顿饭 一个人可以先把粥煮上然后去炒菜 并发做一顿饭 开多个厨房一个厨房煮粥、一个厨房炒菜(资源开销大) 而且吃饭时还需要端到一起(通信麻烦)什么时候需要开多个厨房当量上来时例如餐厅同时需要多次出餐时才需要 一个厨房同时出菜需要并行补充 并发和并行并发Concurrency交替执行概述在同一时间段内多件事都在向前推进。但由于资源有限同一时刻只有一件事在做。计算机视角如果电脑只有一个 CPU 核心。它在运行微信、浏览器和音乐播放器。CPU 运行微信 1 毫秒然后把微信挂起切去运行浏览器 1 毫秒再切去让音乐播放器响一下。因为切换速度极快微秒级在人类看来它们就像是“同时”运行的。关键词交替、应对很多事情的能力解决的问题怎么合理组织任务别让 CPU 闲着并行Parallelism同时执行概述在同一时刻有多件事在真正地、物理上地同时进行计算机视角你的电脑有一颗 8 核 CPU。当你 同时 导出视频核 1 在狂算和玩 3D 游戏核 2、核 3 在狂算时这些核心在物理上是在同一时刻各自独立运转的关键词同时、同时做很多事情的能力。解决的问题怎么增加空间和人手让活干的更快