Python中GIL全局解释锁的实现
作者:小Pawn爷 时间:2023-04-27 16:29:14
GIL(Global Interpreter Lock,即全局解释器锁)
1.为什么有GIL
设计者为了规避类似于内存管理这样的复杂的竞争风险问题(race condition)
因为 CPython 大量使用 C 语言库,但大部分C语言库都不是原生线程安全的(线程安全会降低性能和增加复杂度)
2.GIL 是如何工作的
多个线程执行时,每一个线程在开始执行时,都会锁住 GIL,以阻止别的线程执行,同样的,每一个线程执行完一段后,会释放 GIL,以允许别的线程开始利用资源
CPython 中还有另一个机制,叫做 check_interval, CPython 解释器会去轮询检查线程 GIL 的锁住情况.每隔一段时间,Python 解释器就会强制当前线程去释放 GIL,这样别的线程才能有执行的机会
for (;;) {
if (--ticker < 0) {
ticker = check_interval;
/* Give another thread a chance */
PyThread_release_lock(interpreter_lock);
/* Other threads may run now */
PyThread_acquire_lock(interpreter_lock, 1);
}
bytecode = *next_instr++;
switch (bytecode) {
/* execute the next instruction ... */
}
}
3.python的线程安全
有了GIL,任然在编程时需要考虑线程安全
4.如何如何绕过 GIL?
绕过 CPython,使用 JPython(Java 实现的Python解释器)等别的实现
把关键性能代码,放到别的语言(一般是 C++)中实现
5.在处理cpu密集型任务时,为什么有时候使用多线程会比单线程还要慢些?
GIL采用轮流运行线程的机制,GIL需要在线程之间不断轮流进行切换,线程如果多或者运行时间较长,切换带来的性能损失可能超过单线程
6 .你觉得 GIL 是一个好的设计吗?
事实上,在 Python 3 之后,确实有很多关于 GIL 改进甚至是取消的讨论,你的看法是什么呢?你在平常工作中有被 GIL 困扰过的场景吗?
GIL任然是一个好的设计虽然损失了性能,但在保证资源不会冲突和预防死锁方面有一定作用
来源:https://blog.csdn.net/weixin_44689630/article/details/129776268
标签:Python,GIL,全局解释锁
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Python json模块dumps、loads操作示例
2023-01-03 20:16:29
Python脚本如何在bilibili中查找弹幕发送者
2021-05-18 21:46:15
![](https://img.aspxhome.com/file/2023/8/123748_0s.jpg)
使用Jupyter notebooks上传文件夹或大量数据到服务器
2023-02-26 11:49:16
window.location 对象所包含的属性
2024-04-16 10:32:14
PyTorch实现图像识别实战指南
2022-01-08 14:27:24
![](https://img.aspxhome.com/file/2023/2/72142_0s.jpg)
thinkphp四种url访问方式详解
2024-05-05 09:16:50
Python实现端口复用实例代码
2023-12-16 19:58:32
asp如何自动反馈电子邮件?
2002-01-01 06:54:00
基于Keras的格式化输出Loss实现方式
2021-10-20 20:44:00
![](https://img.aspxhome.com/file/2023/2/92312_0s.jpg)
Python写安全小工具之TCP全连接端口扫描器
2023-12-30 13:34:52
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
2024-06-07 15:29:45
MYSQL METADATA LOCK(MDL LOCK)MDL锁问题分析
2024-01-15 04:45:54
Python常用时间操作总结【取得当前时间、时间函数、应用等】
2021-01-12 20:32:33
Django利用elasticsearch(搜索引擎)实现搜索功能
2022-04-30 01:59:37
![](https://img.aspxhome.com/file/2023/5/115845_0s.jpg)
网页设计:巧用记事本编辑网页
2008-02-05 09:00:00
python optparse模块使用实例
2021-02-03 22:01:36
PHP伪协议基本原理介绍
2023-05-30 00:24:11
![](https://img.aspxhome.com/file/2023/9/55369_0s.png)
python处理文本文件实现生成指定格式文件的方法
2022-01-07 21:41:43
Python打包为exe详细教程
2023-08-23 03:00:21
![](https://img.aspxhome.com/file/2023/4/124374_0s.png)
MySQL将select结果执行update的实例教程
2024-01-17 14:00:59
![](https://img.aspxhome.com/file/2023/6/68606_0s.png)