python 的GIL 和线程锁的关系

发布于 2022-09-06 08:36:03 字数 587 浏览 28 评论 0

Python代码的执行由Python 虚拟机(也叫解释器主循环,CPython版本)来控制,Python 在设计之初就考虑到要在解释器的主循环中,同时只有一个线程在执行,即在任意时刻,只有一个线程在解释器中运行。对Python 虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同一时刻只有一个线程在运行。
在多线程环境中,Python 虚拟机按以下方式执行:
1. 设置GIL
2. 切换到一个线程去运行
3. 运行:
    a. 指定数量的字节码指令,或者
    b. 线程主动让出控制(可以调用time.sleep(0))
4. 把线程设置为睡眠状态
5. 解锁GIL
6. 再次重复以上所有步骤

在调用外部代码(如C/C++扩展函数)的时候,GIL 将会被锁定,直到这个函数结束为止(由于在这期间没有Python 的字节码被运行,所以不会做线程切换)。

这里主要有2个问题
1.python 里面的GIl是全局锁,然后这个是控制线程的?每个时刻只能一个线程,为啥线程还要上锁防止竞争呢?这不是矛盾吗?我有点不太理解,因为这块我看过很多文章了

2.怎么判断python里面字节码的执行过程,我的理解就是一些运算操作指令需要字节码

谢谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

遥远的她 2022-09-13 08:36:03

CPython将代码翻译为python虚拟机指令。线程从指令集中获取指令去执行。GIL的全局锁保证了同一时刻最多只能有一个线程去指令集获取指令。为啥线程还要上锁防止竞争呢? 这是因为CPython本身并不是线程安全的,也涉及到垃圾回收的。可能一个我们认为一个动作可能需要多个指令去完成的, a = {} 在可能要 4~5 个指令来完成这个动作。

关于多线程的GIL问题,可以看看这篇关于源码上的分析:https://www.hongweipeng.com/i...

python里面字节码的执行过程问题里写的虚拟机运行方式是正确的,关于字节码和执行过程可以看看:https://www.hongweipeng.com/i... 这是对于一般表达式的字节码和其执行过程。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文