cpython引入GIL的目的到底是什么,求详解?
PHP中文网
PHP中文网 2017-04-17 16:17:33
0
2
718

查了很多资料,这些资料基本直说到GIL会让是字节码只让一个线程执行,但是为什么要这么做的原因,都感觉没说的很彻底。所以想请高人解惑!!

PHP中文网
PHP中文网

认证0级讲师

membalas semua(2)
刘奇

在python之父的一些谈话中,可以看出一些些猫腻。

有些听众问到global interpreter lock(GIL),想要更深入了解这个问题,以及这个问题是如何解决的。Van Rossum笑着反问道:“你有多少时间?”他简要的讲述了GIL产生的历史。在Python诞生后,多核计算机出现了。当线程运行在不同的内核中时,两个或更多的处理器要更新同一个对象便产生了竞争机制,特别在Python垃圾回收处理机制中。

一个合理的解决方案就是给每个对象上锁,这样能保护数据不被多路存取破坏。但结果导致当没有锁的竞争时,上锁和解锁操作代价高昂。一些实验表明,不需要上锁的单线程程序性能会因此降低2倍。这意味着只有在使用三个或多个线程或内核的程序会从中获益。

因此,GIL 诞生了(尽管这个名字在它被添加到解释器后很久才出现)。它是一个立刻有效锁定所有对象的单一锁,这样所有对象访问将排序进行。目前的问题是,10年或15年以后,多核处理器无处不在,人们想要不必进行多重处理就可利用它们(例如,使用独立的进程而不是线程通信)

他说,如果你当今想要设计一种新语言,要让它没有易变的对象,或者有限的易变性。然而,听众中传来“这就不是 Python 了”。Van Rossum 赞成的说:“你说出了我要说的话”。GIL 周围有很多开发者不断的努力,包括 PyPy 软件事务内存(STM),以及 PyParallel。其他开发者也撞破了脑袋在想解决办法。如果有人知道有什么办法能够移除 GIL 且让语言保持 Python 特性,Van 和其他人将很乐意听到。

小葫芦

因为锁的粒度越小, 实现起来越复杂, 而且可能还会因为锁而降低性能. 所以就加了全局大锁.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan