聊一聊Cpython的GIL
Published:
GIL锁是什么?
当多个线程同时执行Python代码时,GIL(全局解释器锁)是一个互斥锁,用于确保只有一个线程可以在任何时候执行Python字节码。
在CPython中,由于GIL的特性,多线程中的每个线程只能轮流执行,因此无法实现真正的多线程。这是因为所有线程都共享CPython解释器进程的内存,并且垃圾回收机制会对一些变量进行回收,因此同一时间只能有一个线程运行。
需要注意的是,GIL不是Python语言的特性,而是CPython解释器的特性。如果想要支持多线程,可以使用其他解释器。虽然GIL的存在会导致多线程无法利用多核,但是需要注意的是,GIL唯一的限制是计算密集型任务。对于I/O密集型任务,GIL并不会成为瓶颈。
启动一个Python程序的三步骤
Python程序的启动过程可以分为以下三个步骤:
- 操作系统会生成一个CPython解释器进程
- 将Python代码加载到内存中
- CPython解释器解析和运行Python代码
GIL锁导致多线程无法利用多核
在CPython中,由于GIL的特性,多线程中的每个线程只能轮流执行,因此无法实现真正的多线程。GIL本质上是一个互斥锁。
需要注意的是,GIL不是Python语言的特性,而是CPython解释器的特性。如果想要支持多线程,可以使用其他解释器。
在CPython解释器中,所有线程都共享进程的内存。由于垃圾回收机制会对一些变量进行回收,因此同一时间只能有一个线程运行。
为什么CPython有GIL?
CPython诞生于90年代,那个时候只有单核CPU。GIL的出现是为了解决CPython内存管理/垃圾回收不是线程安全的问题。
虽然GIL的存在会导致多线程无法利用多核,但是需要注意的是,GIL唯一的限制是计算密集型任务。对于I/O密集型任务,GIL并不会成为瓶颈。
许多热门的Python库都是基于CPython开发的,因此迁移成本较高,而且很难改变GIL的特性。需要注意的是,可以使用多进程来解决计算密集型任务的瓶颈问题。