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
  • asp之家 网络编程 m.aspxhome.com