大家好,我是正在实战各种 AI 项目的程序员晚枫。
Python 的并发编程,常被人误解。"有 GIL 所以多线程没用"——这是一个危险的过度简化。真正的问题是:你的任务是 CPU 密集型还是 IO 密集型?搞清楚这个,才能选对工具。
🧩 理解 GIL:真正的含义
GIL 是什么?
GIL(Global Interpreter Lock,全局解释器锁)是 CPython 解释器中的一把互斥锁,它确保同一时刻只有一个线程在执行 Python 字节码。
1 | 线程 1 ─────[获取GIL]──执行字节码──[释放GIL]──────────────── |
GIL 什么时候释放?
关键点:GIL 并不是永远锁住的——
1 | import sys |
结论:
- IO 密集型任务 → GIL 在等待 IO 时主动释放 → 多线程有用
- CPU 密集型任务 → 纯计算,GIL 不释放 → 多线程没用,用多进程
🧵 threading:IO 密集型的利器
基础用法
1 | import threading |
线程同步:Lock 和 Event
1 | import threading |
🔀 multiprocessing:CPU 密集型的救星
真正的并行
1 | import multiprocessing |
进程间通信
1 | import multiprocessing as mp |
⚡ concurrent.futures:现代并发的首选
concurrent.futures 是 Python 标准库提供的高级并发接口,推荐优先使用:
1 | from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor, as_completed |
Future 对象
1 | from concurrent.futures import ThreadPoolExecutor |
📊 性能对比
实际测试中,不同场景的加速效果:
1 | import time |
🗺️ 选择指南
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 网络请求、文件 IO | ThreadPoolExecutor | GIL 在 IO 时释放,线程开销小 |
| 大量网络连接(万级) | asyncio | 协程开销极小,见第18讲 |
| CPU 密集计算 | ProcessPoolExecutor | 绕过 GIL,真正利用多核 |
| 数值计算 | NumPy + 多进程 | NumPy 内部释放 GIL |
| 混合型任务 | 线程池 + 进程池组合 | 分层架构 |
⚠️ 常见陷阱
1. 多进程中 if name == 'main' 不可省略
1 | # Windows 上必须有这行,否则子进程会递归启动 |
2. 不要在线程间共享可变状态(除非有锁)
1 | # ❌ 危险:竞态条件 |
3. 进程间通信只能传递可 pickle 的对象
1 | # ❌ lambda 不能 pickle,不能用于多进程 |
🎯 本讲总结
GIL 的真相:只限制 CPU 密集型多线程;IO 等待时主动释放,多线程对 IO 密集型有显著提升。
threading:适合 IO 密集型;Lock/Event 处理同步;代码简单但需小心共享状态。
multiprocessing:适合 CPU 密集型;真正并行利用多核;进程间通信有开销,只能传 pickle 对象。
concurrent.futures:ThreadPoolExecutor 和 ProcessPoolExecutor 提供统一接口;推荐优先使用,比直接用 threading/multiprocessing 更简洁。
选择原则:IO 密集 → 多线程;CPU 密集 → 多进程;海量连接 → asyncio(下一讲)。
📚 推荐教材
《Python 编程从入门到实践(第 3 版)》 | 《流畅的 Python(第 2 版)》 | 《CPython 设计与实现》
学习路线: 零基础 → 《从入门到实践》 → 《流畅的 Python》 → 本门课程 → 《CPython 设计与实现》
🎓 加入《流畅的 Python》直播共读营
学到这里,如果你想系统吃透这本书——欢迎加入我的直播共读课。
- 每周直播精讲,逐章拆解核心知识点
- 专属学习群,随时答疑交流
- 试运营特惠:
499 元→ 299 元
👉 【立即报名《流畅的 Python》共读课】:https://mp.weixin.qq.com/s/ivHJwn1nNx5ug4TFrapvGg
🔗 课程导航
💬 联系我
| 平台 | 账号/链接 |
|---|---|
| 微信 | 扫码加好友 |
| B 站 | Python 自动化办公社区 |
主营业务:AI 编程培训、企业内训、技术咨询
