先看官方描述:
In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.)
看这说明,在CPython中,全局解释器锁:GIL是必需存在,因为CPython的内存管理不是线程安全的。
所以,由于GIL的存在,Python无法利用多处理器的优势,任意时刻只会有一个线程运行在解释器中。也就是大计算量的程序在Python中通过多线程处理并不一定就会变快。
但是,并不是说,Python就不需要多线程编程了。
IO密集型程序可以很好地利用多线程,例如Python开发的客户端程序,如果单线程实现,假如发送一个http请求服务器端需要耗费5s来处理,那么客户端程序发送一个请求,发送完成之后,然后就等着,本机CPU也空闲着,在等着服务器返回数据,串行发送1000个就需要5000s左右;但是开1000个线程,就可以同时发送1000个请求(其实不是真的同时,因为在解释器中同一个时刻只有一个线程在运行,只是,开了1000个线程的话,对应1000个请求,程序串行的执行1000个线程,把请求发送出去,那是非常快的,我们在感官上就觉得是同时),然后就一起等待响应,服务器性能好的话,说不定10s之内就能完成1000个请求。