Python 全局翻译锁(GIL Global Interpreter Lock)
为了实现在多核环境下的运行时数据的一致性,Python采用加锁的思想来实现这种同步和一致性,这把锁就是GIL。这造成了一定量的性能损失,使用锁的原因是因为Python解释器内部是线程不安全的。
另外一点,首先需要明确的一点是 GIL 并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把 GIL 归结为Python语言的缺陷。所以这里要先明确一点:GIL并不是Python的特性,Python完全可以不依赖于GIL
Python的多线程虽然是真正的多线程,并非虚拟出来的多线程,但是由于GIL的存在导致了python在多线程运行程序的时候,有可能会比单线程运行还要慢,但是可以采用多进程的方式来执行多任务,因为多进程的时候每个进程都有一个GIL,互相不影响。
但是至于Python的多线程有没有意义是需要看任务类型的,通常情况下我们的任务可以分成IO密集型任务和计算密集型任务,如果是计算密集型任务,就需要利用多核多线程来实现并发,提升性能,这种情况下,可能Python的多线程就不能很好的利用多核,从而不能提升性能,但是如果是IO密集型任务,CPU的使用本身就不高,此时Python的多线程就能很好的提高CPU的利用率,因为IO的时候,CPU也是闲着。