Python多线程在I/O密集场景下有效,因I/O操作会自动释放GIL,使其他线程可并发执行;而CPU密集型任务长期持有GIL,导致伪并发。
Python 多线程在 I/O 密集场景下有效,核心原因是:当线程遇到 I/O 操作(如文件读写、网络请求、数据库查询)时,会主动释放 GIL(全局解释器锁),让其他线程得以运行。这避免了 CPU 空等,提升了整体吞吐。
CPython 的 I/O 调用(比如 socket.recv()、time.sleep()、open().read())底层会调用操作系统提供的阻塞系统调用。这些调用一旦发起,Python 解释器会检测到“当前线程要等外部响应”,于是自动释放 GIL,允许别的线程获取锁并执行 Python 字节码。
这意味着:一个线程在等网路响应的几毫秒甚至几秒里,其他线程可以真正并发地干活,而不是被卡住。
CPU 密集型任务(如数学计算、图像处理)几乎不触发 I/O,线程长期持有 GIL,且 CPython 的线程调度器只在执行约 100 条字节码后才尝试强制切换(通过计数器)。结果就是多个线程实质上串行执行,还多出线程切换开销。
不是开了多线程就自动高效,要注意三点:

顺序请求 5 个网页,单线程耗时 ≈ 5 × 单次响应时间(假设都 1s,共 5s);5 线程并发请求,理想情况下总耗时接近最长那个请求(≈1s),因为其余 4 个请求是在等待中“并行发起”的——GIL 在每个 requests.get() 进入 socket 阻塞时就松开了。
这种重叠等待,正是 I/O 密集型多线程提速的本质。