CPython引入GIL的原因

CPython引入GIL的原因

CPython引入GIL的原因 #

CPython 使用引用计数来管理内存,所有 Python 脚本中创建的实例,都会有一个引用计数,来记录有多少个指针指向它。当引用计数只有 0 时,则会自动释放内存。

什么意思呢?我们来看下面这个例子:

>>> import sys
>>> a = []
>>> b = a
>>> sys.getrefcount(a)
3

这个例子中,a 的引用计数是 3,因为有 a、b 和作为参数传递的 getrefcount 这三个地方,都引用了一个空列表。

这样一来,如果有两个 Python 线程同时引用了 a,就会造成引用计数的 race condition,引用计数可能最终只增加 1,这样就会造成内存被污染。因为第一个线程结束时,会把引用计数减少 1,这时可能达到条件释放内存,当第二个线程再试图访问 a 时,就找不到有效的内存了。

所以说,CPython 引进 GIL 其实主要就是这么两个原因:

一是设计者为了规避类似于内存管理这样的复杂的竞争风险问题(race condition);二是因为 CPython 大量使用 C 语言库,但大部分 C 语言库都不是原生线程安全的(线程安全会降低性能和增加复杂度)。

Viewpoint #

From #

23 | 你真的懂Python GIL(全局解释器锁)吗?