多线程、多进程与 asyncio 并发
并发编程是 Python 高级开发的核心技能。正确使用并发模型可以显著提升程序性能。
本篇学习路径
知识依赖图:
┌─────────────────────────────────────────────────────────────┐
│ 并发与异步编程学习路径 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 前置:02-核心编程篇(函数、类、异常处理) │
│ │
│ 第1章 并发基础概念 │
│ ├── 前置:无 ← 本章起点 │
│ └── 输出:理解并发vs并行、GIL、任务类型分类 │
│ │ │
│ ↓ │
│ 第2章 多线程编程 │
│ ├── 前置:第1章(理解 GIL 和 I/O 密集型) │
│ └── 输出:能用 Thread/ThreadPoolExecutor 并发执行任务 │
│ │ │
│ ↓ │
│ 第3章 线程同步 │
│ ├── 前置:第2章(线程创建与管理) │
│ └── 输出:能用 Lock/RLock/Semaphore/Condition 保护共享数据 │
│ │ │
│ ↓ │
│ 第4章 多进程编程 │
│ ├── 前置:第1章(理解 GIL 限制) │
│ └── 输出:能用 Process/ProcessPoolExecutor 突破 GIL │
│ │ │
│ ↓ │
│ 第5章 asyncio 异步编程 │
│ ├── 前置:第2章(I/O 密集型场景体验) │
│ └── 输出:能用 async/await 实现高并发 I/O │
│ │ │
│ ↓ │
│ 第6章 并发模型选择 │
│ ├── 前置:第2章 + 第4章 + 第5章 │
│ └── 输出:能根据任务特点选择正确的并发模型 │
│ │
│ 关键路径:1→2→3→5→6(I/O 方向) │
│ 替代路径:1→4→6(CPU 方向) │
│ │
└─────────────────────────────────────────────────────────────┘学习建议:
- 完整学习:按 1→2→3→4→5→6 顺序
- 只关注 Web 开发:跳过第3、4章,学 1→2→5→6
- 只关注数据处理:跳过第3、5章,学 1→4→6
学习路线
┌─────────────────────────────────────────────────────────────┐
│ 并发编程学习路线 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Step 1: 理解概念 │
│ 01-并发基础概念.md │
│ • 并发 vs 并行 │
│ • GIL 是什么?为什么存在? │
│ │
│ Step 2: 多线程基础 │
│ 02-多线程编程.md │
│ • 创建线程、线程池 │
│ • 适合:I/O 密集型(网络请求、文件读写) │
│ │
│ Step 3: 线程同步 │
│ 03-线程同步.md │
│ • Lock、Semaphore、Event │
│ • 解决竞态条件、生产者-消费者模型 │
│ │
│ Step 4: 多进程 │
│ 04-多进程编程.md │
│ • 进程创建、进程池 │
│ • 适合:CPU 密集型(图像处理、数据分析) │
│ │
│ Step 5: 异步编程 │
│ 05-asyncio异步编程.md │
│ • async/await、事件循环 │
│ • 适合:高并发 I/O(Web服务器、API客户端) │
│ │
│ Step 6: 模型选择 │
│ 06-并发模型选择.md │
│ • 如何选择正确的模型? │
│ • 最佳实践与性能对比 │
│ │
└─────────────────────────────────────────────────────────────┘章节导航
| 章节 | 文件 | 核心主题 | 适合场景 |
|---|---|---|---|
| 01 | 01-并发基础概念.md | 并发 vs 并行、GIL | 理论基础 |
| 02 | 02-多线程编程.md | 线程创建、线程池 | I/O 密集型 |
| 03 | 03-线程同步.md | Lock、Semaphore | 共享数据保护 |
| 04 | 04-多进程编程.md | 进程创建、进程池 | CPU 密集型 |
| 05 | 05-asyncio异步编程.md | 协程、async/await | 高并发 I/O |
| 06 | 06-并发模型选择.md | 模型对比、决策树 | 综合实战 |
快速决策指南
你的任务是什么类型?
┌─────────────────────────────────────────┐
│ CPU 密集型? │
│ (计算、图像处理、加密、数据分析) │
│ │
│ → 使用多进程 (multiprocessing) │
│ → 不受 GIL 限制,真正并行 │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ I/O 密集型? │
│ (网络请求、文件读写、数据库查询) │
│ │
│ → 低并发:多线程 (threading) │
│ → 高并发:asyncio │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ 需要使用同步库? │
│ (requests 而非 aiohttp) │
│ │
│ → 使用多线程 │
│ → asyncio 无法直接使用同步代码 │
└─────────────────────────────────────────┘示例项目
async_demo/ - 并发编程实践示例
学习建议
- 先理解 GIL:不理解 GIL,就无法理解为什么多线程不能加速 CPU 计算。
- 动手实验:使用文档中的性能对比代码,亲眼见证不同模型的性能差异。
- 从线程池开始:实际开发中,优先使用
ThreadPoolExecutor/ProcessPoolExecutor,而不是手动创建线程/进程。 - asyncio 是未来:对于 Web 开发和高并发场景,asyncio 是首选方案。