结论:一句话选型:I/O 密集且并发量中等用 threading,I/O 密集且高并发/精细控制用 asyncio,CPU 密集用 multiprocessing(绕过 GIL 真正并行)。判断依据是瓶颈在哪里——等 I/O 时 GIL 会释放,算数时不会。

展开:三者的机制差异决定适用面:1)threading——OS 线程,受 GIL 限制同一时刻只有一个线程执行 Python 字节码,但阻塞型 I/O(网络、文件、time.sleep)会释放 GIL,所以 I/O 等待期间其他线程能跑;优点是写法同步化、库兼容性好,缺点是多核无法用于计算。2)asyncio——单线程协作式调度,一个事件循环管上万连接,上下文切换在用户态、成本远低于线程;代价是全程 async/await 感染、阻塞调用(requests、time.sleep)会卡住整个循环,必须用异步库或 run_in_executor。3)multiprocessing——多进程各自带解释器和 GIL,真并行;代价是进程开销大、数据要序列化跨进程传递(pickle)、共享状态麻烦(Queue/Manager/共享内存)。易错点:CPU 密集开更多 threading 只会更慢(GIL 竞争 + 切换开销);混合负载(Web 服务里算图)常组合使用——asyncio 接流量,重计算丢给 ProcessPoolExecutor。

from concurrent.futures import ProcessPoolExecutor
with ProcessPoolExecutor() as pool:
    results = list(pool.map(heavy_cpu, chunks))  # 真并行

追问方向:GIL 在 C 扩展(numpy)中释放的机制、free-threading 构建对这张选型表的影响。