GIL的历史由来:
python中的GIL详解 - 可可的私房菜 - 博客园 (cnblogs.com)
总结:Python的多线程在多核CPU上,只对于IO密集型计算产生正面效果;而当有至少有一个CPU密集型线程存在,那么多线程效率会由于GIL而大幅下降。
个人理解:
GIL只是CPython的产物(参考:python解释器)
GIL:创建python时只考虑到单核,为了解决多线程数据的完整性和同步状态的一把全局排他锁(一个防止多线程并发执行机器码的一个Mutex),几乎就相当于python是个单线程的程序。
由于GIL的存在,两个CPU密集型线程存在,实际上任意时间只有一个线程在跑,两个CPU密集型线程本质上其实是交替在跑。
但如果是多个IO密集型运算,在IO遇到阻塞时自动释放锁,这个时候线程切换去处理其他事情资源利用率上升。
但当至少存在一个CPU密集型线程,IO线程无法获得GIL锁,会一直处于等待状态。
改进方法:multiprocessing库
弥补thread库因为GIL而低效的缺陷。
使用多进程而不是多线程,每个进程都有自己独立的GIL,多进程间不会争抢