Python 多线程编程深入解析
1. Python 线程模型
Python 的 threading 模块基于 操作系统原生线程(POSIX 线程或 Windows 线程),但由于 GIL(全局解释器锁) 的限制,Python 线程 不能真正并行执行 Python 代码,但对于 IO 密集型任务(文件、网络、数据库操作) 仍然非常有用。
1.1 GIL(全局解释器锁)详解
GIL 限制了同一时间只有一个线程在执行 Python 字节码。即使是多核 CPU,Python 线程也不会真正并行执行,而是通过 轮流切换 的方式运行。
GIL 影响的测试
以下代码创建 2 个线程,每个线程执行 10^7 次循环。由于 GIL 限制,多线程反而比单线程更慢:
import threading
import time
COUNT = 10**7
def cpu_bound_task():
x = 0
for _ in range(COUNT):
x += 1
start = time.time()
t1 = threading.Thread(target=cpu_bound_task)
t2 = threading.Thread(target=cpu_bound_task)
t1.start()
t2.start()
t1.join()
t2.join()
print("多线程耗时:", time.time() - start)
# 单线程
start = time.time()
cpu_bound_task()
cpu_bound_task()
print("单线程耗时:", time.time() - start)
结论:
CPU 任务 不适合多线程,应使用 multiprocessing。
IO 任务(如网络请求、文件操作)适合多线程。
2. 线程同步与安全
由于多个线程可能同时访问同一变量,容易导致竞态条件(Rac