🧩 一、核心概念
1. 并发 vs 并行
- 并发(Concurrency):看似同时执行多个任务,实际快速切换。
- 并行(Parallelism):真正同时执行多个任务(需多核支持)。
2. Python 解释器与 GIL
- CPython:官方实现,使用 GIL 限制并行执行。
- GIL(Global Interpreter Lock):同一时刻仅允许一个线程执行字节码,利于线程安全,但限制多核并行。
- Jython / IronPython / PyPy:其他解释器(可能无 GIL),适用于特定平台或场景。
🧵 二、线程编程(threading
模块)
1. 线程基础概念
类型 | 说明 |
---|
主线程 | Python 程序启动后默认的执行线程。 |
子线程 | 通过 threading.Thread() 创建的新线程。 |
守护线程 | 程序退出时不等待其完成(后台任务),设置 daemon=True 。 |
2. 创建线程的两种方式
import threadingdef task():print("线程任务")t = threading.Thread(target=task)
t.start()
class MyThread(threading.Thread):def run(self):print("子类线程任务")t = MyThread()
t.start()
3. 常用方法与属性
方法/属性 | 说明 |
---|
start() | 启动线程 |
join() | 阻塞等待线程结束 |
is_alive() | 判断线程是否存活 |
daemon | 是否为守护线程 |
name / ident | 获取线程名称 / 标识符 |
current_thread() | 返回当前线程对象 |
4. 线程同步机制
✅ Lock(互斥锁)
lock = threading.Lock()
with lock:
✅ RLock(可重入锁)
同一线程可重复获取,避免死锁。
✅ Condition(条件变量)
用于线程间条件通知。
cond = threading.Condition()def consumer():with cond:cond.wait()print("消费数据")def producer():with cond:cond.notify()
✅ Semaphore(信号量)
控制最大并发线程数。
sem = threading.Semaphore(3)
with sem:
✅ Event(事件)
用于线程通信。
event = threading.Event()event.set()
event.wait()
5. 线程池(推荐)
from concurrent.futures import ThreadPoolExecutorwith ThreadPoolExecutor(max_workers=5) as pool:pool.submit(task)
1. 特点
特性 | 描述 |
---|
独立性 | 每个进程有独立内存,崩溃不互相影响 |
支持并行 | 不受 GIL 限制,可在多核 CPU 上并行执行 |
通信方式 | 需使用 IPC(队列、管道、共享内存) |
开销较大 | 创建/销毁成本高,资源占用大 |
2. 创建进程
from multiprocessing import Processdef task():print("子进程任务")p = Process(target=task)
p.start()
p.join()
3. 进程间通信
- 使用
Queue
或 Pipe
传递数据。 - 使用
Manager().dict()
共享数据结构。
⚙️ 四、协程编程(asyncio
模块)
1. 特点
- 非阻塞、单线程:通过事件循环管理大量 I/O 操作。
- 节省资源:适合高并发网络编程(如爬虫、聊天服务等)。
- 使用 async/await 语法实现异步流程控制。
2. 示例
import asyncioasync def task(n):print(f"任务{n}开始")await asyncio.sleep(1)print(f"任务{n}结束")async def main():await asyncio.gather(task(1), task(2))asyncio.run(main())
🚧 五、线程安全问题:共享数据与加锁
示例:线程不安全代码
count = 0
def inc():global countfor _ in range(100000):count += 1
使用锁解决:
lock = threading.Lock()def safe_inc():global countfor _ in range(100000):with lock:count += 1
🎯 六、各并发方式适用场景总结
场景类型 | 优选方案 | 说明 |
---|
CPU 密集型 | 多进程 | 利用多核,规避 GIL |
I/O 密集型 | 多线程 / 协程 | 异步执行阻塞操作,提升资源利用率 |
网络并发 | 协程 (asyncio ) | 万级并发连接,性能高 |
GUI 程序 | 子线程处理耗时任务 | 避免主线程阻塞 UI |
📌 七、总结对比表
特性 | 线程 | 进程 | 协程 |
---|
是否受 GIL 限制 | 是 | 否 | 是(但通常无影响) |
内存占用 | 低 | 高 | 极低 |
创建/销毁开销 | 小 | 大 | 最小 |
通信方式 | 共享内存(需加锁) | IPC(队列、管道) | 共享对象/await |
并行能力 | 伪并行(受 GIL) | 真并行(多核) | 非并行,异步并发 |
推荐场景 | I/O密集 | CPU密集 | 大量并发 I/O |
📚 推荐阅读
- Python 官方 threading 文档
- asyncio 官方文档
- 《流畅的Python》第18-20章:深入协程和并发