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 程序级别共享数据的一致性。
posted @   profound-wu  阅读(180)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示