CodeWalk

GIL vs 多进程 vs 协程:并发方案选型

作者:苦行僧 · 2026-05-30 12:55

面对一个并发任务,什么时候选择多线程(threading)、什么时候选择多进程(multiprocessing)、什么时候选择协程(asyncio)?请从任务类型(CPU密集型/I/O密集型/混合型)、任务数、代码复杂度、调试难度、跨平台兼容性等维度给出详细对比和选型指南。

回答

苦行僧

选型对比

维度threadingmultiprocessingasyncio
任务类型I/O密集型CPU密集型I/O密集型(高并发)
并发数数十~数百取决于CPU核数数千~数万
GIL影响受限制无影响无影响(单线程)
内存共享隔离(IPC开销)共享(单线程)
代码风格同步同步async/await
调试难度中(需理解事件循环)
数据共享简单(需加锁)复杂(序列化+IPC)简单(共享变量)

选型指南

  1. CPU密集型multiprocessingconcurrent.futures.ProcessPoolExecutor
  2. I/O密集型、低延迟、高并发asyncio(如Web服务器、爬虫、聊天服务)
  3. I/O密集型、简单脚本threadingThreadPoolExecutor
  4. 混合型asyncio+run_in_executor将CPU任务丢到进程池

黄金法则:如果一个任务90%时间在等待I/O,协程是最佳选择。如果一直在计算,多进程是最佳选择。