Python 中的 GIL 如果可以去掉的话,是不是只要有线程锁就完全不会产生负面影响?

2018-05-31 15:27:45 +08:00
 sy52676
菜鸟,搞不明白为什么有了线程锁还要有 GIL。是因为 GIL 是被动添加上去的吗?
GIL 和线程锁的区别又在哪里呢?
3426 次点击
所在节点    Python
7 条回复
neoblackcap
2018-05-31 15:36:05 +08:00
颗粒度不一样,因为如果去掉 GIL 相当于现在的 Python 里面的每一个操作都是不安全的,哪怕你是一个简单的加法运算,因为加法运行也可能变动引用计数。天知道这里面有多少依赖 CPython 实现的。
还有就是 GvR 要求去掉 GIL 不能减慢单线程性能,要兼容性就必须上细颗粒锁,锁多了性能肯定会下降,这才是为什么 CPython 的 GIL 不好去掉的缘故
sy52676
2018-05-31 15:39:13 +08:00
@neoblackcap 好像明白一些,但是你讲的好高深。。。
jimmyczm
2018-05-31 19:35:39 +08:00
@sy52676 简单和你说一下吧,我也不知道
HelloAmadeus
2018-05-31 22:51:32 +08:00
简单说吧,引用计数不去掉,估计 gil 锁就去不掉
qoras
2018-05-31 23:51:07 +08:00
保证使用基础结构时不用加锁, 如 dict
neoblackcap
2018-06-01 00:10:29 +08:00
@qoras 不可能,因为 CPython 里面所有的对象都对应底层 C 语言级别 PyObject 结构体,每个对象都有一个引用计数,不用 GIL 没法保证引用计数的变动线程安全。
如果改动的话,Java 就是一个很好的例子,大锁改成细颗粒锁,外加 concurrent 包,同时啊,引用计数应该改成 tracing GC。引用计数在现在的技术下不比 tracing gc 优秀
xxxy
2018-06-01 12:00:48 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/459260

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX