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

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

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

这是一个锁或阻碍,可以阻止Python解释器同时供多个线程使用。GIL被认为是Python 3.x或更早版本中的一个故障/问题,因为它不允许在多线程架构中进行多线程。

阅读更多:Python 教程

为什么要引入它?

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

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

在这种情况下,如果引用计数同时不断减少和增加,则自动收集程序将无法正常工作,从而增加内存泄漏的可能性。

为了减少这个风险,引入了Python的GIL。通过添加全局锁来减少风险被认为比添加锁到每个变量更好,这将导致一系列的锁定导致死锁。

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

为什么Python中仍然存在GIL

需要改进GIL,以便我们可以更好地处理它。因此,我们正在努力改进GIL概念而不是直接删除GIL。由于Python与C和Cpython的基础紧密关联,因此无法直接删除GIL。尽管有各种处理GIL的问题的方法,但这些方法难以实现并降低了系统的处理和运行时间。

例如,

假设正在运行具有线程t1和t2的进程P1。由于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中移除它。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册