什么是 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 中删除它。