深入理解 CPython 中的 GIL(全局解释器锁)

月亮慢半拍
月亮慢半拍
发布时间:2026-10-15| 3人浏览过
原创

本文详细解析 CPython 解释器中的全局解释器锁(GIL)。GIL 是 CPython 特有的机制,用于保证内存管理的线程安全,但导致同一进程下的多线程无法利用多核优势进行并行计算。文章通过代码示例对比了加锁与不加锁对全局变量操作的影响,并分析了 GIL 的优缺点及运行机制。

GIL 的基本概念与定义

1、什么是 GIL 全局解释器锁

GIL 全称为 Global Interpreter Lock(全局解释器锁)。需要明确的是,GIL 并非 Python 语言本身的特性,而是 CPython 解释器引入的一个概念。在其他语言编写的 Python 解释器中,例如 Jython 或 PyPy,并不存在 GIL 这一机制。

以下是官方文档对 GIL 的解释:

In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython's memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.)

将其翻译为中文,意思如下:在 CPython 中,全局解释器锁(GIL)是一个互斥锁,它防止多个本地线程同时执行 Python 字节码。引入该锁的主要原因是 CPython 的内存管理并非线程安全。(不过,由于 GIL 的存在,其他功能特性已逐渐依赖于它所强制执行的保证。)

综上所述:

GIL 本质上是一把互斥锁,其核心作用是保证数据的正确性,确保数据能够正常同步。

GIL 的存在类似于一个“BUG”,作为一个全局互斥锁,目前无法通过代码手段直接移除 GIL。

结论:在 CPython 解释器中,如果在同一个进程下开启多个线程,同一时刻只能有一个线程执行,因此无法直接利用多核 CPU 的优势。

补充说明:我们日常使用的 Python 通常是由 C 语言编写的,因此大多数人提到的 Python 实际上指的就是 CPython。CPython 是 Python 的官方标准版本。如果指的是由其他语言编写的解释器,通常会明确指明,例如 Jython、PyPy 等。

GIL 的引入原因与互斥锁示例

2、为什么会出现 GIL

随着计算机多核 CPU 的普及,为了充分利用多核处理能力,Python 的多线程编程方式逐渐普及。然而,随之而来的挑战是线程间数据的一致性和状态同步问题。为了解决数据不同步的问题,Python 设计了 GIL(全局解释器锁),其本质仍是一把互斥锁。

在多线程环境下使用互斥锁时,如果多个线程共享全局变量,可能会发生资源竞争,导致对全局变量的修改结果不符合预期。此时,通常会使用 Python 线程模块中的互斥锁来解决这一问题。

以下示例展示了未添加线程互斥锁的情况:


from threading import Threadimport time


n = 100
def task():
  global n
  m = n
  time.sleep(0.5)  # 模拟IO操作
  n = m - 1


if __name__ == '__main__':
  list1 = []
  for i in range(10):
    t = Thread(target=task)
    t.start()
    list1.append(t)

  for t in list1:
    t.join()

  print(n)

执行结果如下:

99

在上述示例中,我创建了 10 个线程来对变量 n 执行 -1 操作,但最终结果并非预期的 90。因此,我在代码中加入了互斥锁。

以下示例展示了添加线程互斥锁后的情况:


from threading import Thread
from threading import Lock
import time


n = 100
def task(lock):
  global n
  lock.acquire()  # 加锁
  m = n
  time.sleep(0.5)  # 模拟IO操作
  n = m - 1
  lock.release()  # 解锁


if __name__ == '__main__':
  list1 = []
  lock = Lock()
  for i in range(10):
    t = Thread(target=task, args=(lock, ))
    t.start()
    list1.append(t)

  for t in list1:
    t.join()

  print(n)

执行结果如下:

90

通过添加互斥锁,我们得到了预期的正确结果。

GIL 的优缺点分析

3、GIL 的优缺点

优点:

保证数据的正确性。

缺点:

在单个进程下开启多个线程时,会牺牲执行效率,无法实现真正的并行计算,只能实现并发处理。

GIL 的运行机制

4、如何体现 GIL 全局解释器锁

在 CPython 解释器中,当一个 Python 线程开始访问解释器时,GIL 会将这把“大锁”锁定。此时,其他线程只能等待,无法访问解释器的资源,这与互斥锁的行为相似。只有当该线程分配的时间片用完,并释放 GIL(类似于互斥锁的 lock.release() 操作)后,其他线程才能开始运行。

以上就是 CPython 解释器中 GIL(全局解释器锁)的详细内容,更多关于 GIL 的资料请关注本站其他相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。