什么是GIL锁 GIL,是最流行在 Python 解释器 CPython 中的一个技术术语。它的意思是全局解释器锁,本质上是类似操作系统的 Mutex。每一个 Python 线程,在 CPython 解释器中执行时,都会先锁
什么是GIL锁
GIL,是最流行在 Python 解释器 CPython 中的一个技术术语。它的意思是全局解释器锁,本质上是类似操作系统的 Mutex。每一个 Python 线程,在 CPython 解释器中执行时,都会先锁住自己的线程,阻止别的线程执行。
CPython会轮流执行 Python 线程。这样一来,用户就会看到线程交替执行,似乎是并行,但是其实只有一个线程在运行。现在都是多核CPU,可以实现线程的并行运行,所以Python中并不是和使用多线程。
GIL如何工作
下面这张图,就是一个 GIL 在 Python 程序的工作示例。其中,Thread 1、2、3 轮流执行,每一个线程在开始执行时,都会锁住 GIL,以阻止别的线程执行;同样的,每一个线程执行完一段后,会释放 GIL,以允许别的线程开始利用资源。
CPython 中还有另一个机制,叫做 check_interval,意思是 CPython 解释器会去轮询检查线程 GIL 的锁住情况。每隔一段时间,Python 解释器就会强制当前线程去释放 GIL,这样别的线程才能有执行的机会。
如何绕过GIL
上面提到,Python不适合多线程工作(除非Python在未来的版本取消掉GIL),如果强行使用多线程,它的运行效率可能还低于单线程。
解决问题的一个好办法就是避免问题,在程序对性能要求高的情况下,我们不妨使用以下几种办法:
- 使用第三方库。很多高性能应用场景都已经有大量的 C 实现的 Python 库,例如 NumPy 的矩阵运算,就都是通过 C 来实现的,并不受 GIL 影响。
- 使用Python的多进程+协程。Python3.5提供了对异步的支持,3.6+使用更方便,这是一个不错的选择。
- 使用其他Python解释器,比如JPython,但是使用第三方一般会比官方慢几个版本,且很多三方库都不支持。