聊一聊Cpython的GIL

Published:

GIL锁是什么?

当多个线程同时执行Python代码时,GIL(全局解释器锁)是一个互斥锁,用于确保只有一个线程可以在任何时候执行Python字节码。

在CPython中,由于GIL的特性,多线程中的每个线程只能轮流执行,因此无法实现真正的多线程。这是因为所有线程都共享CPython解释器进程的内存,并且垃圾回收机制会对一些变量进行回收,因此同一时间只能有一个线程运行。

需要注意的是,GIL不是Python语言的特性,而是CPython解释器的特性。如果想要支持多线程,可以使用其他解释器。虽然GIL的存在会导致多线程无法利用多核,但是需要注意的是,GIL唯一的限制是计算密集型任务。对于I/O密集型任务,GIL并不会成为瓶颈。

启动一个Python程序的三步骤

Python程序的启动过程可以分为以下三个步骤:

  1. 操作系统会生成一个CPython解释器进程
  2. 将Python代码加载到内存中
  3. CPython解释器解析和运行Python代码

GIL锁导致多线程无法利用多核

在CPython中,由于GIL的特性,多线程中的每个线程只能轮流执行,因此无法实现真正的多线程。GIL本质上是一个互斥锁。

需要注意的是,GIL不是Python语言的特性,而是CPython解释器的特性。如果想要支持多线程,可以使用其他解释器。

在CPython解释器中,所有线程都共享进程的内存。由于垃圾回收机制会对一些变量进行回收,因此同一时间只能有一个线程运行。

CPython解释器中线程执行原理

为什么CPython有GIL?

CPython诞生于90年代,那个时候只有单核CPU。GIL的出现是为了解决CPython内存管理/垃圾回收不是线程安全的问题。

虽然GIL的存在会导致多线程无法利用多核,但是需要注意的是,GIL唯一的限制是计算密集型任务。对于I/O密集型任务,GIL并不会成为瓶颈。

许多热门的Python库都是基于CPython开发的,因此迁移成本较高,而且很难改变GIL的特性。需要注意的是,可以使用多进程来解决计算密集型任务的瓶颈问题。