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,全局解释锁
0
投稿
猜你喜欢
np.random.seed() 的使用详解
2021-04-08 23:54:57
python 内置函数-range()+zip()+sorted()+map()+reduce()+filter()
2022-09-23 19:48:01
python上传时包含boundary时的解决方法
2021-03-28 08:28:54
让IE6更快的走向灭亡
2010-02-03 15:05:00
js阻止移动端页面滚动的两种方法
2023-08-04 17:36:12
Python实现的检测网站挂马程序
2023-11-21 16:39:38
asp如何准确地获得一个整数?
2010-07-07 12:25:00
PyTorch零基础入门之逻辑斯蒂回归
2022-09-09 03:44:25
基于Python获取docx/doc文件内容代码解析
2022-09-20 09:25:23
js 混淆加密工具代码
2007-09-22 18:10:00
python利用xlsxwriter模块 操作 Excel
2023-02-11 00:43:02
Python实现多线程抓取妹子图
2022-10-02 15:39:25
Django日志和调试工具栏实现高效的应用程序调试和性能优化
2022-10-25 10:58:01
使用numpngw和matplotlib生成png动画的示例代码
2023-06-15 13:38:21
Python环境配置实现pip加速过程解析
2022-09-23 12:42:37
解决安装python库时windows error5 报错的问题
2022-06-14 05:26:04
keras topN显示,自编写代码案例
2021-03-19 03:15:13
Python中关于 *args与**args的用法及说明
2022-04-01 08:24:38
aspjpeg组件安装问题
2008-09-27 17:52:00
Python远程方法调用实现过程解析
2022-12-24 01:26:45