多线程 Threading
Thread 创建/启动/join、GIL 全局锁、Lock/RLock 线程安全
多线程 Threading
Python 的 threading 真正并行吗?GIL(全局解释器锁) 让 CPU 密集型任务无法加速——但 IO 密集型可以。
学完本章你将: 掌握 Thread 创建/启动/join、GIL 原理、Lock/RLock。
创建线程
python
import threading
import time
def worker(name, delay):
for i in range(3):
time.sleep(delay)
print(f"{name}: 第 {i+1} 次")
# 创建并启动
t1 = threading.Thread(target=worker, args=("线程1", 0.5))
t2 = threading.Thread(target=worker, args=("线程2", 0.3))
t1.start()
t2.start()
# 等待线程结束
t1.join()
t2.join()
print("全部完成")
GIL —— 为什么多线程不加速 CPU 任务
python
# CPU 密集型——线程没用
def count():
for _ in range(50_000_000):
pass
# 两个线程比单线程还慢(GIL 切换开销)
# → 用 multiprocessing 解决
# IO 密集型——线程很好
# → 网络请求、文件读写时释放 GIL
线程锁
python
lock = threading.Lock()
counter = 0
def increment():
global counter
for _ in range(100_000):
with lock: # 获取锁(等价于 lock.acquire() ... lock.release())
counter += 1
threads = [threading.Thread(target=increment) for _ in range(10)]
for t in threads: t.start()
for t in threads: t.join()
print(counter) # 1_000_000(正确)
线程池
python
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=4) as executor:
futures = [executor.submit(worker, f"任务{i}", 0.5)
for i in range(10)]
for f in futures:
print(f.result()) # 等待结果