Python 面试题

Python GIL:为什么要有?对代码意味着什么

Python为什么有GIL?对我的多线程代码意味着什么?

为什么面试官会问这道题

做并行的公司Python面试必问——答"Python就是慢"直接挂。

如何回答

  1. 1

    GIL=一把锁,同一时刻只有一个线程能执行Python字节码。保护CPython的引用计数内存管理不被并发破坏。

  2. 2

    影响:CPU密集的Python线程不能并行——它们轮流跑。IO密集能受益——阻塞IO时GIL会释放。

  3. 3

    绕过:multiprocessing(每进程独立解释器独立GIL)、asyncio(IO并发)、释放GIL的C扩展(numpy、PyTorch)。

  4. 4

    PEP 703(Python 3.13+)引入可选no-GIL构建("free-threaded")。2026年还在成熟,生产多数仍是有GIL版本。

  5. 5

    不是所有Python都有GIL:Jython和IronPython从来没有。PyPy有。

参考回答示例

GIL的由来:CPython用引用计数,每次操作都原子化计数会让单线程性能崩盘。于是用一把全局锁串行化字节码执行。面试级结论:CPU密集线程不加速(被串行化),IO密集线程能加速(阻塞IO时GIL释放)。爬虫、socket、DB查询用线程OK。数值计算要么用multiprocessing、要么靠numpy/torch这类在C层释放GIL的库。Python 3.13 free-threaded是实打实的进展但生产多数还是有GIL。口诀:CPU密集→多进程或C扩展;IO密集→asyncio(比线程更干净);混合→带队列的线程池。

实用技巧

  • asyncio并不绕GIL——它只是协作式让出。仍然一个Python线程。

  • numpy计算时常释放GIL——所以numpy+多线程能在CPU任务上扩。

  • 即答侠把GIL对应到实战选择(Gunicorn worker vs thread)——答出来有味道。

常见问题

现在能换no-GIL Python吗?

3.13+有实验性的--disable-gil构建。部分C扩展不保证线程安全,上之前要测一遍生态。

CPython为什么不能直接细粒度锁?

试过(Greg Stein 1999)。单线程性能掉约2倍。直到最近才找到不付出这代价的做法。

面试时担心忘词?即答侠实时助你

即答侠 AI 实时监听面试对话,自动识别问题并即时生成回答建议——无感辅助,让你从容应对每一道题。

免费试用即答侠