Sunday面试指南

Python 的 GIL 是什么?多线程与 free-threaded 构建该怎么理解?

🧑‍💻 面试官:Python 的 GIL 是什么?有 GIL 就不能并发了吗?

🙋‍♂️ 我:GIL 让 Python 一次只能执行一个线程,所以多线程没用。

🧑‍💻 面试官:两个线程都在等待接口,为什么还能缩短总等待?

🙋‍♂️ 我:I/O 会释放 GIL,CPU 任务才不适合。

🧑‍💻 面试官:如果是释放 GIL 的原生库,或者 free-threaded CPython,这个结论还成立吗?

GIL 的结论必须带运行时条件:是不是 CPython、是否启用 GIL、工作是不是 Python 字节码。

面试速答(60 秒版)

在启用 GIL 的常见 CPython 构建中,同一解释器内通常只有一个线程执行 Python 字节码。它限制的是这一类并行执行,不代表所有 I/O 都必须串行。

等待 I/O 或调用会释放 GIL 的原生扩展时,多线程仍可能有效。纯 Python 的 CPU 密集任务,常会考虑多进程,但也要计算启动、通信和内存成本。

CPython 从 3.13 起提供可选的 free-threaded 构建,不能继续说所有 Python 永远都有同样的 GIL 限制。还要确认扩展兼容性和当前进程是否实际启用了 GIL。

GIL 也不是业务数据安全锁。跨多个步骤的共享状态操作,仍要按并发逻辑使用同步机制。

GIL结论依赖CPython构建和任务类型,I/O并发与可选free-threaded需区分

知识点详解:GIL 限制的是什么,不限制的又是什么

先给传统结论补上适用范围

假设你在一个启用 GIL 的 CPython 进程里,启动两个线程做纯 Python 大循环。它们可以轮流推进,但不能据此保证两个核心同时执行这两段 Python 字节码。

这就是常见“CPU 密集任务用线程不一定加速”的背景。它不是 Python 语言规范给所有实现写下的永久限制,也不是整个进程完全只有一条系统线程。

面试时先说明运行时,再讨论任务类型。省掉这个条件,后面遇到原生数值库或新构建就容易说错。

等接口和做计算,要分别分析

线程等待网络或文件 I/O 时,运行时和相应接口可以释放 GIL,让其他线程继续执行。两个请求的等待因此可能重叠。

原生扩展也可能在计算期间释放 GIL,让底层并行能力发挥作用。但是否释放、内部是否自己使用线程,要看实际库,不能因为名字里有 C 就作保证。

因此,“用了线程没加速”要进一步看CPU、等待、锁竞争和库实现。线程调度、任务过小或下游限流,也可能抵消收益。

多进程绕开共享解释器,也带来别的成本

多个进程各有解释器与内存,可以并行执行各自的 Python 代码。ProcessPoolExecutor 是一种组织方式,但数据要经过进程边界。

大对象的序列化、进程启动、内存复制和结果传输,可能成为新的耗时。进程数也要配合CPU配额,而不是只看系统报告的核心总量。

Node 的 worker_threads 与 Python 的进程池不是同一个模型。本题没有提供可机械翻译的 TypeScript GIL 实现,不为凑语言数量制造同名概念。

free-threaded 和数据安全,必须单独检查

CPython 3.13 起的可选 free-threaded 构建允许关闭 GIL。构建是否支持和当前进程是否启用,属于两个检查层面;有些不兼容扩展被导入后,可能重新启用 GIL。

即使关闭了 GIL,也不会自动让程序按核心数加速。任务划分、锁竞争、内存访问和第三方库仍会影响结果。

反过来,有 GIL 也不保证业务操作原子安全。例如“检查余额,再扣款”跨多个步骤,其他线程仍可能在中间推进。应该使用正确的锁、事务或并发模型,而不是把解释器锁当业务锁。

验证时记录解释器版本、构建方式、GIL实际状态与扩展,并在相同输入下比较真实结果和耗时。不能只把线程数量写到日志里,就宣称实现了并行。

本题机制参考:Python:threading、Python:Free threading。

面试官继续追问

Python 多线程完全不能利用多核吗?

不能绝对说。要看解释器、GIL状态与原生库是否释放GIL;free-threaded构建也改变了条件。

有 GIL 就不用加锁吗?

不对。业务不变量可能跨多个操作,解释器内部锁不替你保护整段业务。

CPU 任务全部改成多进程就行吗?

还要衡量通信、启动和内存成本,任务过小或传输过大时不一定值得。

面试速记卡

  • 条件:CPython、构建方式、当前GIL状态。
  • 传统限制:启用GIL时,同解释器Python字节码难以线程并行。
  • I/O与原生扩展:可能释放GIL,必须看实际实现。
  • free-threaded:3.13起可选,不等于所有环境默认无GIL。
  • 安全:GIL不是业务锁,跨步骤不变量仍需保护。

公司面试真题

这道题暂未收录可核验的公司真题来源。你可以先阅读本文解析,或浏览已收录的公司面试真题。

浏览公司面试真题 →
简历汪永久免费在线制作简历,模板直接套用、导出无水印,永久免费、下载免费,不需要付费解锁任何功能。去写简历