Z
ZHANK
并发编程

多线程 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())  # 等待结果