什么是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),如果强行使用多线程,它的运行效率可能还低于单线程。
解决问题的一个好办法就是避免问题,在程序对性能要求高的情况下,我们不妨使用以下几种办法: