Skip to content

多线程、多进程与 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                                          │
│  • 如何选择正确的模型?                                      │
│  • 最佳实践与性能对比                                        │
│                                                             │
└─────────────────────────────────────────────────────────────┘

章节导航

章节文件核心主题适合场景
0101-并发基础概念.md并发 vs 并行、GIL理论基础
0202-多线程编程.md线程创建、线程池I/O 密集型
0303-线程同步.mdLock、Semaphore共享数据保护
0404-多进程编程.md进程创建、进程池CPU 密集型
0505-asyncio异步编程.md协程、async/await高并发 I/O
0606-并发模型选择.md模型对比、决策树综合实战

快速决策指南

你的任务是什么类型?

┌─────────────────────────────────────────┐
│         CPU 密集型?                      │
│   (计算、图像处理、加密、数据分析)       │
│                                         │
│   → 使用多进程 (multiprocessing)        │
│   → 不受 GIL 限制,真正并行              │
└─────────────────────────────────────────┘

┌─────────────────────────────────────────┐
│         I/O 密集型?                      │
│   (网络请求、文件读写、数据库查询)       │
│                                         │
│   → 低并发:多线程 (threading)           │
│   → 高并发:asyncio                      │
└─────────────────────────────────────────┘

┌─────────────────────────────────────────┐
│         需要使用同步库?                  │
│   (requests 而非 aiohttp)              │
│                                         │
│   → 使用多线程                           │
│   → asyncio 无法直接使用同步代码         │
└─────────────────────────────────────────┘

示例项目

async_demo/ - 并发编程实践示例


学习建议

  1. 先理解 GIL:不理解 GIL,就无法理解为什么多线程不能加速 CPU 计算。
  2. 动手实验:使用文档中的性能对比代码,亲眼见证不同模型的性能差异。
  3. 从线程池开始:实际开发中,优先使用 ThreadPoolExecutor / ProcessPoolExecutor,而不是手动创建线程/进程。
  4. asyncio 是未来:对于 Web 开发和高并发场景,asyncio 是首选方案。