GIL——全局解释器锁

发布时间 2023-10-02 01:56:25作者: Gensokyo_Alice

前言

首先我们先来看这样一个东西,有时我们可以在网上看到这样的言论。
比如“Python多线程没有用,应该使用多进程。”

然后在笔者在网上搜索原因的时候看到了GIL这样的东西,笔者发现就是因为GIL导致了这样的话,不过因为不是所有情况、所有Python解释器都有GIL,所以这句话并不全面,但是有时候这句话确实是对的。

GIL

GIL:Global Interpreter Lock —— 全局解释器锁

正是因为GIL,所以Python每一个进程同一时间只能执行一个线程。

那么笔者就问,既然这个东西不是很好,为什么会被设计出来呢?
不过设计者的初衷是为了Python的线程安全,不过现在看来似乎也不是很安全,不过Python也不需要自己手动线程锁了(笑)

也就是实际上它尝试用很粗粒度的锁保证整体上的线程安全。

那么我们为什么不把这个删掉呢?答案是很多东西已经围绕GIL开发出来了,删除它的成本大于留下它的成本,所以在版本更新的时候没有删除,不过我们可以选择其他Python解释器来解决这个问题。(不过新问题是社区太小)

GIL导致的问题

多核多线程运行Python甚至比单核多线程运行Python效率可能会更加底下,为什么呢,答案很简单。

在CPU0上的线程1交出GIL的时候,CPU1上的线程2还没被唤醒,此时线程1又拿回了GIL,那么线程2此时申请GIL就会失败,然后重复这个过程,就会导致实际上和顺序执行没有任何区别。(也就是线程颠簸)

那么为什么多进程就可以解决这个问题呢?答案是每个进程有自己的GIL(乐)

总结

所以多线程适合IO密集型(文件处理和网络爬虫等)事实上在这方面多线程恶和多进程运行效率差不多,但是线程开销更小;多进程适合CPU密集型(也就是数值计算等)

不过注意多进程之间的通信问题也是十分复杂的。

多核下,想做并行提升效率,比较通用的方法是使用多进程,能够有效提高执行效率