关于 GIL

article/2025/4/24 20:04:11

目录

  • GIL是什么
  • GIL产生的原因
  • 如何避免受到GIL的影响
  • 什么时候会释放GIL锁
  • 互斥锁和Gil锁的关系

参考链接

python中的GIL详解

python面试不得不知道的点——GIL

《Python面试每日一题》之GIL

Python GIL 是功能和性能之间权衡后的产物,它尤其存在的合理性,也有较难改变的客观因素

GIL是什么

  • 全局解释器锁(global interpreter lock),每个线程在执行时候都需要 先获取GIL,保证同一时刻只有一个线程可以执行代码,即同一时刻只有一个线程使用CPU,也就是说 多线程并不是真正意义上的同时执行
    在这里插入图片描述

GIL产生的原因

  • 创建python时就 只考虑到单核CPU,解决多线程之间数据完整性和状态同步的最简单方法自然就是加锁, 于是有了GIL这把超级大锁
  • Cpython(使用C语言编写的Python解释器)的 内存管理不是线程安全
  • 因为cpython解析只允许拥有GIL全局解析器锁才能运行程序,这样就保证了保证同一个时刻只允许一个线程可以使用 CPU
  • 当使用Cpython解释器解释多线程程序时,为了保证线程安全,即共享资源的原子性。默认使用了一个GIL,导致多线程实际是 “伪多线程”

如何避免受到GIL的影响

用multiprocess替代Thread

  • multiprocess库的出现很大程度上是为了弥补thread库因为GIL而低效的缺陷
  • 它完整的复制了一套thread所提供的接口方便迁移
  • 唯一的不同就是它使用了 多进程 而不是多线程。每个进程有自己的独立的GIL,因此也不会出现进程之间的GIL争抢
  • 但其引入会 增加程序实现时线程间数据通讯和同步的困难
  • 就拿计数器来举例子,如果我们要多个线程累加同一个变量,对于thread来说,申明一个global变量,用thread.Lock的context包裹住三行就搞定了。而multiprocess由于进程之间无法看到对方的数据,只能通过在主线程申明一个Queue,put再get或者用share memory的方法。这个额外的实现成本使得本来就非常痛苦的多线程程序编码,变得更加痛苦了

用其他解析器 【不推荐】

  • GIL只是CPython的产物,但像 JPython和IronPython 这样的解析器由于实现语言的特性,他们不需要GIL的帮助
  • 然而由于用了Java/C#用于解析器实现,他们也失去了利用社区众多C语言模块有用特性的机会,所以这些解析器也因此一直都比较小众
  • 毕竟功能和性能大家在初期都会选择前者,Done is better than perfect

在使用多线程可以使用c语言去实现

什么时候会释放GIL锁

  • 遇到像 I/O 操作这种 会有时间空闲情况 造成 CPU 闲置 的情况会释放GIL
  • 会有一个专门ticks进行计数 一旦 ticks数值达到100 这个时候释放GIL锁 线程之间开始竞争Gil锁
    • 说明: ticks这个数值可以进行设置来延长或者缩减获得GIL锁的线程使用cpu的时间

互斥锁和Gil锁的关系

  • Gil锁 : 保证同一时刻只有一个线程能使用到cpu
  • 互斥锁 : 多线程时,保证修改共享数据时有序的修改,不会产生数据修改混乱

http://chatgpt.dhexx.cn/article/TaZkbuCm.shtml

相关文章

gin介绍

Gin的介绍与应用 Gin是一个golang的web框架,Gin像是一些常用函数或者工具的集合。具有快速灵活,容错方便等特点。Gin自身的net/http足够简单,性能也非常不错。 Gin的官网:https://github.com/gin-gonic/gin 安装前保证git和go都安…

gin_gorm

一、使用形式 1、引入gorm包 import "github.com/jinzhu/gorm" 2、导入数据库驱动 import _ "github.com/go-sql-driver/mysql"为了方便记住导入路径,GORM包装了一些驱动: import _ "github.com/jinzhu/gorm/dialects/mysq…

【GIC】配置GIC

本章介绍如何在裸机环境中启用和配置兼容GICv3的中断控制器。 目录 一、全局设置 二、单独PE设置 2.1 Redistributor配置 2.2 CPU接口配置 2.3 PE配置 三、SPI, PPI, SGI配置 3.1设置SPI的目标PE 附:寄存器介绍 附1:GICD_CTLR 附2:…

大寰AG-95夹爪指尖更换、结构示意图及通讯协议转换器说明

注意: 在对手爪进行任何操作之前,请先关闭机器人和夹持电源。 大寰AG-95夹爪指尖更换更换步骤: 1. 使用 M3 内六角螺丝刀卸下指尖螺丝,拆卸磨损的指尖。 2. 清洁手指件并彻底擦干。 3. 取出指尖上φ3x6 mm 定位销。 4. 将…

使用Landsat系列数据来检测喜马拉雅地区的冰湖溃决(Georg Veha等人,RSE,2018)

一、背景 这是一篇做冰湖溃决的文章,作者主要使用了random forest来检测喜马拉雅地区的冰湖溃决现象,这项成果发表在了Remote Sensing of Environment上。 文献连接:https://doi.org/10.1016/j.rse.2017.12.025 文献引用:Georg Ve…

App设计灵感之十二组精美的智能家居App设计案例

通过手机远程启动家里的各种家用电器,让我们回到家后可以享受到舒适的环境,这便是智能家居给我们带来的便利。 ① Smart Hub Application design by Ariuka ② Smart Home by Srgi Mi ③ Smart Home Mobile App by Ghulam Rasool ④ Smart Home Mobile …

基恩士KV8000通过HT3S-EIS-MDN网关与大寰机器人交换数据

一、概述 本文主要介绍使用HI-TOP网关 HT3S-EIS-MDN在基恩士KV8000 PLC和大寰RGI系列旋转抓手之间进行数据交换。 解决的问题:基恩士PLC KV8000监控和大寰RGI系列旋转抓手。 解决方法:使用HI-TOP网关 HT3S-EIS-MDN。基恩士KV8000支持EthterNet/IP协议…

CARD耐药数据库Linux使用

一、背景 关于耐药性有很多数据库可以使用,但是CARD的优势在于数据库较为准确,只有经过文章进行验证后的基因才会被记录 二、软件链接 软件github: GitHub - arpcard/rgi: Resistance Gene Identifier (RGI). Software to predict resistomes from p…

(原创)用红黄蓝RYB色相环(伊登色相环)代替RGB(RGI/RGV)色相环

作者:❄️固态二氧化碳❄️ (主页) 链接:(原创)用红黄蓝RYB色相环(伊登色相环)代替RGB(RGI/RGV)色相环 - 固态二氧化碳的博客 - CSDN博客 来源:CSDN博客 发表时间:2019年05月28日 12:33:57 著作权归作者所有。商业转载请联系作者获…

APT、ET、RGI、ICQ

越来越大的屏幕尺寸和越来越多的需要显示屏常亮应用,要求手机厂商必须从各个方向考虑来提升电池续航时间。一般而言,手机上常用的有两种 PA 的省电技术,一种是平均功率跟踪技术(APT),另外一种是包络跟踪&am…

十、ABP

一、官网 安装 安装成功Core 2.2版本的 转载于:https://www.cnblogs.com/fger/p/10641811.html

abp Step1

refs: 1)下载模板后用vs2017打开 2)Web项目设置为起始项目 3)在包管理终端下选择EntityFramework为默认项目,运行"Update-Database",创建数据库 4)运行项目,默认用户admin密码123qwe

ABP框架入门

🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一…

Abp v2.8.0发布 路线图

ABP框架和ABP商业版v2.8已经发布.这篇文章将涵盖这些发布中的新增内容和项目的中期路线图. ABP框架2.8有哪些新增内容? 你可在GitHub的发行说明中看到所有的变更.这篇博客只包括重要的一些功能/变更. SignalR集成包 我们已经发布了一个新的包用来集成SignalR到基于ABP框架应用…

Abp 业务异常源码解读

Abp 业务异常源码解读 最近一直在读代码整洁之道,我在读到第三章函数的3.9 使用异常替代返回错误码,其实在我的开发经历中都是使用返回错误码给到前端,之前在阅读ABP官网文档中就有看到过使用异常替代异常的做法,当时自己还是比较…

abp快速入门#3

abp快速入门#3 使用AbpHelper.CLI快速实现crud 使用AbpHelper.CLI快速实现crud https://github.com/EasyAbp/AbpHelper.CLI 按照使用说明安装abphelper dotnet tool install -g EasyAbp.AbpHelper参照例子创建Todo实体对象。 执行abphelper自动生成代码,-d 参数为…

abp官网下载的项目如何跑起来

目录 前言 一、pandas是什么? 二、使用步骤 1.下载项目 2.解压压缩包运行文件 3.在项目路径里面找到这两个文件,把数据库位置写上去,例如本地就local host 4.在工具里面找到程序包管理控制台 5.运行成功 6.设置启动项 7.运行成功就会有相…

【转】ABP源码分析三十三:ABP.Web

ABP.Web模块并不复杂,主要完成ABP系统的初始化和一些基础功能的实现。 AbpWebApplication : 继承自ASP.Net的HttpApplication类,主要完成下面三件事 一,在Application_Start完成AbpBootstrapper的初始化。整个ABP系统的初始化就是通过AbpBoo…

ABP学习 之 准备

学习ABP准备 ABP准备数据库准备后端启动前端启动 ABP准备 到ABP官网下载Free Template 将下载到的压缩包解压到目录 由于当时选择使用vue为前端,所以vue子目录是前端代码,aspnet-core为后端代码 数据库准备 准备一个数据库,设置好用户的o…

LoRa及LoRaWAN简介

目录 1、什么是LoRa和LoRaWAN 1.1 LoRa和LoRaWAN的区别 1.2 LoRa扩频技术介绍 1.2.1 什么是扩频技术 1.2.2 扩频技术的作用 1.2.3 扩频技术常用术语介绍 1.3 LoRaWAN帧结构 1.4 硬件方案介绍 1.4.1 终端设备方案 1.4.2 网关方案 2、LoRaWAN网络架构 3、LoRaWAN终端设备分类 …