Python中GIL全局解释器锁的实现方式及原理解析
1.为什么有GIL
设计者为了规避类似于内存管理这样的复杂的竞争风险问题(race condition)
因为 CPython 大量使用 C 语言库,但大部分C语言库都不是原生线程安全的(线程安全会降低性能和增加复杂度)
2.GIL 是如何工作的
多个线程执行时,每一个线程在开始执行时,都会锁住 GIL,以阻止别的线程执行,同样的,每一个线程执行完一段后,会释放 GIL,以允许别的线程开始利用资源
CPython 中还有另一个机制,叫做 check_interval, CPython 解释器会去轮询检查线程 GIL 的锁住情况.每隔一段时间,Python 解释器就会强制当前线程去释放 GIL,这样别的线程才能有执行的机会
for (;;) { if (--ticker <h3>3.<a style="color:#f60; text-decoration:underline;" href="https://www.php.cn/zt/15730.html" target="_blank">python</a>的线程安全</h3><p>有了GIL,任然在编程时需要考虑线程安全</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/00968c3c2c15" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">Python免费学习笔记(深入)</a>”;</p><h3>4.如何如何绕过 GIL?</h3><p>绕过 CPython,使用 JPython(Java 实现的Python解释器)等别的实现<br>把关键性能代码,放到别的语言(一般是 C++)中实现</p><h3>5.在处理cpu密集型任务时,为什么有时候使用多线程会比单线程还要慢些?</h3><p>GIL采用轮流运行线程的机制,GIL需要在线程之间不断轮流进行切换,线程如果多或者运行时间较长,切换带来的性能损失可能超过单线程</p><h3>6 .你觉得 GIL 是一个好的设计吗?</h3><p>事实上,在 Python 3 之后,确实有很多关于 GIL 改进甚至是取消的讨论,你的看法是什么呢?你在平常工作中有被 GIL 困扰过的场景吗?</p><p>GIL任然是一个好的设计虽然损失了性能,但在保证资源不会冲突和预防死锁方面有一定作用</p>