python gil锁存在的意义_关于python的GIL全局解释器锁的简单理解

GIL是解释器内部的一把锁,确切一点说是CPython解释器内部的一把锁,所以要注意区分 这和我们在Python代码中使用线程锁Lock并不是一个层面的概念。

1. GIL产生的背景:

在CPython解释内部运行多个线程的时候,每个线程都需要解释器内部申请相应的全局资源,由于C语言本身比较底层造成CPython在管理所有全局资源的时候并不能应对所有线程同时的资源请求,因此为了防止资源竞争而发生错误,对所有线程申请全局资源增加了限制-全局解释器锁。

言外之意,就是全局解释器就是为了锁定整个解释器内部的全局资源,每个线程想要运行首先获取GIL,而GIL本身又是一把互斥锁,造成所有线程只能一个一个one-by-one-并发-交替的执行。

2. GIL什么时候释放

在当前线程执行超时后会自动释放

在当前线程执行阻塞操作时会自动释放

当前执行完成时Python之父在观点的最后部分说明 the language doesn't require the GIL -- it's only the CPython virtual machine that has historically been unable to shed it.

解释来说就是Python语言和GIL没有半毛钱关系。仅仅是由于历史原因在Cpython虚拟机(解释器),难以移除GIL

3. 严重问题: 既然CPython解释存在GIL是否意味每个线程在全局变量就不用加Lock互斥锁了呢?

这是一个严重错误的想法,为什么用户操作全局数据还需要加Lock,因为GIL的释放时机我们无法控制-操作非常可能并没有完成,而不像Lock那样我们用完才释放(操作完整)。

正因为解释器锁的原因导致python的多线程说到底还是单线程,每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码。所以就算使用多线程,其实还是一个线程在工作,但是由于在在IO操作等可能会引起阻塞,会暂时释放GIL,执行完毕后,再重新获取GIL,所以在进行IO等操作时的运行速度还是要比单线程速度快。

但是在运行计算密集型的程序时,需要使用CPU进行大量的计算,但由于GIL锁的性质导致程序巡行中始终都是一个CPU进行计算,所以计算速度及其缓慢,运行此类的程序不推荐使用线程,有两种方式解决:

使用多进程的方式,避免GIL锁的约束

使用其他运行速度较快的语言模块,例如C语言

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打破了vs你错了

为微服务构建REST API时,需要做出一些关于响应的设计决策。 某些响应显然是微服务周围协议的产物–例如3xx代码之类的东西都与重定向和路由有关。 通常,您将尝试获取正确的2xx代码以取得成功。 如有疑问,将为200(确定&#xff09…

php魔术变量的概念_PHP 魔术变量和魔术函数详解

魔术变量PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。有八个魔术常量它们的值随着它们在代码中的位置改变而改变。…

android studio on/off 切换开关,如何使用android studio中的开关小部件来启用/禁用函数()?...

试试这个:import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JFrame;import javax.swing.JRadioButton;public class test {public static volatile boolean activated false;public test() {JFrame q new JFrame();q.…

javabeans_(单元测试)JavaBeans的技巧

javabeans如果您正在编写Java代码,那么您至少要编写一些遵循JavaBean约定的类,即,具有带有公共getter和setter方法的私有属性的类,包含无参数的构造函数,可序列化,并且遵守Equals和HashCode合同。 最重要的…

8分钟答辩稿_5分钟学会8个答辩小套路,教资面试没在怕的啦!

注意!1.笔试成绩查询时间官方给出的时间是12月10日,但是根据往年情况,一般时间都会提前,12月9日下午极有可能开通查询,所以大家要准备好哦~现在进入教资【成绩查询微信群】,老师都会第一时间发布通知&#…

android lable标签,android:label说明

文章目录1. 说明android:label 用于app 在切换activity的时候,自动更换左上角的显示2. 代码架构3. String.xml 字符串资源文件My Application主界面 labsecond 界面 lab4. AndroidMainfest.xmlpackage"com.example.myapplication">android:allowBackup"true&…

Neo4J OGM与Quarkus

在下面的视频中,我演示了一个使用Neo4J数据库和Neo4J OGM的Quarkus应用程序示例。 看一下GitHub上的示例项目 。 我为咖啡豆创建了一个示例域,其中包含我们可以查询和匹配的某些风味配置文件。 红色节点是来自某个国家/地区的咖啡豆,味道像…

鸿蒙os内测版应用名称,谁知道报名鸿蒙系统公测,应用名称怎么填的?

[分享交流]谁知道报名鸿蒙系统公测,应用名称怎么填的?92209电梯直达huafen327001442初窥门径发表于 2020-12-18 21:17:21来自:HUAWEI Mate 30 Pro 5G最新回复 2020-12-26 21:47:39Screenshot_20201218_210913_com.tencent.mm_edit_1719993392…

命令模式应用_命令设计模式的应用

命令模式应用嗨,您好! 今天,我将与您分享一种非常出色的编程设计模式。 它有很多用法,是我的最爱之一。 编程设计模式命令具有多种用例。 在这篇文章中,我们将看到如何实现来自现实世界的东西。 我们将使用电子汽车钥…

Java XMPP负载测试工具

在本文中,我们将开发用Java编写的XMPP负载测试工具。 目录 1.简介 2. XMPP负载测试工具 3.先决条件 4. LoadXmppTest Java程序 4.1。 创建一个新的Maven项目 4.2。 创建主类 4.3。 XmppManager类 4.4。 建立 4.5。 负载测试 5.总结 6.参考 7.下载Maven项目 1.简介 …

android sdcard 压缩图片,android如何往SDCard中存取图片

import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import android.graphics.Bitmap;import android.os.Environment;import android.util.Log;/*** 保存图片的类***/public class SaveBitmap {private f…

python get()函数_C++使用ffpython嵌入和扩展python(python2和python3)

C使用ffpython嵌入和扩展python(python2和python3)摘要:在服务器编程中,经常会用到python脚本技术。Python是最流行的脚本之一,并且python拥有定义良好的C API接口,同时又有丰富的文档,与C结合非常的适合。…

c# opencv 轮廓检测_C#中OpenCVSharp实现轮廓检测

OpenCv提供了函数 findContours()用于对物体轮廓进行检测,该函数实现算法是由S.suzuki K.Abe于1985年发表的。OpenCVSharp封装了这个函数,有2个参数(contours,hierarchy)要做特别的说明。public static void FindContours(InputOutputArray i…

鸿蒙系统的挑战,简单的讲解下何为鸿蒙系统,可能会挑战你的认知颠覆你的想象...

本帖最后由 一梦盛夏 于 2020-12-2 17:33 编辑这篇文章可能会颠覆你的想象,挑战你的认知,请耐心阅读。今天不说专业术语,全部用比喻方式来聊,这样会更明白一些,也欢迎大家一起来讨论。首先,我们先聊聊何为鸿…

linux nat冲突,Linux系统下的NAT及防火墙的混合应用

2011-11-28 13:03朋友你好!我刚开始搞linux,碰到了很多问题,想问你下,希望能帮我解答下。下面是我的一段shell 程序#!/bin/shwhile [ 0 ]doread scoreif [ $score -lt 60 ];thenecho " you must work hard!"…

外贸常用术语_13个常用的国际贸易术语详解

原标题:13个常用的国际贸易术语详解做外贸的我们一定要详细的了解外贸运输术语的含义,每一个术语买卖双方所需承担的责任与义务。这样能够更好的区分买卖双方该承担履行的责任与义务。很多时候我们只是知道我们日常经常用到的,其他的还是不是…

卡夫卡–一次语义学

在分布式环境中,故障是很常见的情况,可以随时发生。 在Kafka环境中,代理可能会崩溃,网络故障,处理故障,发布消息时失败或无法使用消息等。这些不同的场景引入了不同类型的数据丢失和重复。 失败场景 A&am…

android 打印机蜂鸣器,CANON喷墨打印机 蜂鸣器响5声不打印的问题解决办法

CANON喷墨打印机 蜂鸣器响5声不打印的问题解决办法通常我们如果遇到CANON打印机蜂鸣器响5声即表示废墨仓满,一般都可以通过按键且使用02、03、05墨盒的机型按下面方法操作:同时按住左、右两键,插入电源,然后松开两键;按…

python病毒usb文件自动安装_win7禁USB自动安装驱动功能避免木马病毒入侵

用户在限制USB设备使用方面,首先考虑的就是禁止其自动播放,以避免木马病毒入侵,但很多时候,这样的方法并不是很有效。如果你是Win7用户,那就可以通过它独有的“权限控制”技术,从源头上控制USB设备的自动运…

java错误代码典型案例_Java代码中的典型错误

java错误代码典型案例该页面包含在与我一起工作的人的Java代码中看到的最典型的错误。 静态分析(出于明显的原因,我们使用查询无法捕获所有错误,这就是为什么我决定在此处列出所有错误的原因。 如果您要在此处添加其他内容,请告诉…