背景

Global Interpreter Lock(GIL)从字面意思他就是全局解释器锁,所以不要不经脑子就说他是Python的特性,他只是Cpython解释器的一个概念。只是现在大部分人用的都是Cpython的Python,所以才会被大部分人误会。

并发与并行

当代码逻辑完成了需求之后,总会想各种办法来解决速度慢的问题,那么首先来分清楚两个概念,即并发并行

并发指的是一个CPU交替执行多个问题,并行指的是多个CPU同时执行任务。

虽然从感觉上都是“同时”执行,但实际上,并发是因为CPU执行速度快,人为上感受不到延迟,而并行才是真正意义上的“并发”。

GIL是好还是坏?

GIL是因为在语言开发之初,开发者只考虑到单核CPU,但是随着Python的发展,代码量越来越多,所以这在多年Python迭代中也没能很好的解决这个问题。

在单线程的情况下,GIL无疑是好的,因为能帮助用户控制线程安全,用户只需要关注代码逻辑本身,而在多线程的情况下呢,因为有GIL的存在,一个线程只有在拿到GIL锁时才会执行任务,其余线程都处于阻塞状态,这就导致多线程几乎就是单线程。

到了这,就到了下一个需要探讨的话题了,什么时候用多进程,什么时候用多线程

通俗的来讲,计算密集型多用多进程,因为能充分的利用多核CPU的优势,加快程序执行

IO密集型多用多线程,因为在IO密集型的情况下,你无论开多个进程依旧需要阻塞等待,使用多线程就能通过切换来执行任务,当然协程也是一个不错的替代品

GIL能否规避?

想合理的规避GIL,让程序直接压榨电脑性能,提高效率,只需要
多进程 + 协程
* 这个是比较简单也是比较方便的做法,因为多进程后每个进程都是独立的,都有独立的GIL锁,然后再加上协程自动调度任务,就可以比较完美的规避GIL的影响了
更换解释器
* 这个做法不是十分推荐,毕竟我们大部分人用的都是CPython,换了解释器可能就捡了芝麻丢了西瓜