Python 面试题:GIL
谈谈 GIL 是什么?
-
全局解释器锁,是一种互斥锁
-
在 CPython 中,每一个 Python 线程执行前都需要去获得 GIL 锁,获得该锁的线程才可以执行,没有获得的只能等待,当具有 GIL 锁的线程运行完成后,其他等待的线程就会去争夺 GIL 锁,这就造成了,在 Python 中使用多线程,但同一时刻下依旧只有一个线程在运行,所以 Python 多线程其实并不是「并行」的,而是「并发」
为什么会选择 GIL 这种解决方案
- 设计者为了设计简单,规避内存管理的竞争风险。
- 易于使用,能快速上手。
- CPython 大量使用 C 语言库,大部分 C 语言库都不是原生线程安全的。为了防止不一致的修改的发生, c 语言写的扩展需要线程安全的内存管理机制。
GIL 是如何工作的
- CPython 解释器会去轮询检查线程 GIL 的锁住情况,python 3 是 15ms 一个检查周期。
有了 GIL 我们还需要考虑线程安全么?
- 需要。GIL 是为了保证 CPython 执行单条字节码时的原子性。每个 python 语句可能对应多个字节码,在抢占 CPU 的机制下是不能保证程序的数据结构不被破坏的,所以作为程序员我们还是需要使用 lock 机制来保证线程安全。
如何在使用 Python 的情况下,绕过 GIL
- 使用 JPython 等别的实现
- 把关键性代码,放到别的语言中实现。
在我们处理 cpu 密集任务(文中第一个例子)时,为什么有时候使用多线程会比单线程还要慢些?
- 由于 GIL 采用轮流运行流程的机制,GIL 需要在线程之间不断轮流进行切换,线程如果较多或运行时间较长,切换带来的性能损失可能会超过单线程。
使用 GIL 的情况下多线程有意义么
- 有意义,多个线程可以交替的使用 CPU,具体到同一个时刻,仍然只有一个线程在运行。
线程互斥锁和 GIL 的区别
- GIL 和线程互斥锁的粒度是不同的,GIL 是 Python 解释器级别的互斥,保证的是解释器级别共享资源的一致性,而线程互斥锁则是代码级(或用户级)的互斥,保证的是 Python 程序级别共享数据的一致性。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~