什么是 Python 全局解释器锁 (GIL)


在本文中,我们将学习什么是 Python 全局解释器锁 (GIL)。

这是一种锁或障碍,它阻止 Python 解释器同时被多个线程访问。GIL 被认为是 Python 3.x 或更早版本中的一个缺陷/问题,因为它不允许在多线程架构中进行多线程操作。

为什么引入它?

Python 支持自动垃圾回收的概念。一旦对象的引用计数达到零,内存就会被清理并释放以供使用。

>>> import sys
>>> var = {}
>>> print(sys.getrefcount(ar))
>>> 2
>>> v=var
>>> print(sys.getrefcount(v))
>>> 3

在这种情况下,如果引用计数开始同时减少和增加,自动收集器将无法正常工作,因此内存泄漏的可能性会增加。

为了降低这种风险,在 Python 中引入了 GIL。添加全局锁被认为比向每个变量添加锁更好,后者会导致一系列锁,从而导致死锁。

为什么 GIL 仍然存在于 Python 中

GIL 需要改进,以便我们能够更好地处理它。因此,我们正在努力改进 GIL 的概念,而不是删除 GIL。由于 Python 与 C 和 CPython 的基础完全相关,因此我们无法直接删除 Gil。虽然有各种方法可以处理 GIL 解决的问题,但这些方法难以实现,并且会降低系统的处理和运行时间。

例如:

假设进程 P1 正在运行,并且具有线程 t1 和 t2。Python 线程本质上是本地的,由底层操作系统调度。

t1 运行(运行阶段)(获取 GIL)→ t1 等待 I/O(输入/输出)(释放 GIL)→ t2 运行(运行阶段)(获取 GIL,此时 t1 也已准备好运行,但 GIL 被 t2 获取)

因此,在这里 GIL 成为主要的限制因素。因此,如果我们想要编写一个执行大量 CPU 密集型操作的多线程 Python 应用程序/模块,则无法获得所需的结果。

因为,在 Python 中,真正的多线程是不可能的,因为即使多核 CPU 可用,进程实际上也只会同时利用一个 CPU。

但是,在大多数 Python 应用程序(Web 应用程序、基于 Django 的服务器等)中,这并不是问题,因为这些应用程序本质上是 I/O 绑定的。

作为 Python 程序员,我们不必处理获取和释放 GIL,除非我们正在编写在 Python 中可执行的 C/C++ 模块/脚本。

结论

在本文中,我们学习了 Python 全局解释器锁、其重要性以及为什么不能直接从 Python 中删除它。

更新于:2019-08-28

259 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告