当前位置: 首页 > news >正文

python全局解释器锁(GIL)

文章目录

      • 1.cpu工作方式
      • 2.python全局解释器锁与多线程
      • 3.其他语言的多线程
      • 4.如何解决假的多线程

1.cpu工作方式

先来先服务(First Come, First Served,FCFS):
最简单的调度算法,按照作业或进程到达的顺序依次执行。没有考虑作业的执行时间,可能会导致长作业等待时间过长(作业或进程执行时间长的情况下)。

最短作业优先(Shortest Job Next,SJN):
选择下一个最短的作业或进程执行,以最小化平均等待时间。需要预先知道每个作业或进程的执行时间,通常用于批处理系统。

最短剩余时间优先(Shortest Remaining Time Next,SRTN):
是SJN的抢占式版本,允许更短的作业或进程中断当前执行的作业或进程。每次到达一个新的作业或进程时,调度器会检查其估计的剩余执行时间,并决定是否切换到新的作业或进程。

轮转调度(Round Robin):
将CPU时间分成多个时间片(固定大小的时间段),按照顺序分配给不同的进程。当一个时间片用完时,当前进程被暂停并放回就绪队列的末尾,下一个进程开始执行。轮转调度适用于时间片短小,并且进程需要相对公平的CPU时间的场景。

优先级调度(Priority Scheduling):
每个进程或作业都有一个优先级,操作系统根据这个优先级来决定下一个要执行的进程。高优先级的进程将优先于低优先级的进程执行。但是,如果优先级过高可能会导致低优先级的进程饥饿(永远得不到执行)。

多级反馈队列调度(Multilevel Feedback Queue):
将进程划分为几个队列,并分配不同的优先级。新到达的进程首先进入最高优先级的队列。如果一个进程在给定时间片内未完成,则它将被移动到下一个更低优先级的队列中。这种方法结合了轮转调度和优先级调度的特点。

实时调度(Real-Time Scheduling):
用于实时系统,其中任务必须在特定的截止期限内完成。实时调度包括静态优先级调度(任务的优先级在创建时确定,并且不会改变)和动态优先级调度(优先级可以在运行时改变)。

2.python全局解释器锁与多线程

什么是全局解释器锁

全局解释器锁(Global Interpreter Lock,GIL),是为了保证线程安全而引入的互斥锁。众所周知,python是一种解释性语言。每一行代码都会被python解释器经过解析后才能执行。而在任意一个时间片,只有一个线程可以拿到解释器锁,也就是说,任意一个时间片,只有拿到解释器锁的那个线程可以执行,其他线程都处于等待状态。

为什么会有全局解释器锁

历史原因:早期的 Python 设计是为了简化内存管理和线程安全性。GIL 最初是为了保护 Python 对象内存结构不被并发线程破坏而引入的。在 Python 的早期版本中,GIL 是确保线程安全的一个简单有效的方式。

内存管理简化:Python 的内存管理由其自己的内存管理器负责,而 GIL 确保了在解释器级别上只有一个线程可以修改 Python 对象的内存结构。这样做简化了解释器的实现和维护,并且减少了需要考虑的并发问题,尤其是在 Python 解释器中涉及引用计数等细节时。

IO密集型 && 计算密集型操作

IO密集型操作,大部分情况下,指的是文件的读写操作
计算密集型更多的是进行数值运算。
对于IO密集型操作,在读取多个文件时,多个线程本身就存在切换,因此即使存在GIL,没有实现真正的多线程操作,也仍然可以在一定程度上提高效率。而在计算密集型操作上,由于每次只有一个线程在执行,即使开启多个线程,在任意时刻也只会有一个线程执行,因此,在计算密集型任务上,python多线程斌不会真正提高计算相率,相反,由于线程切换,甚至可能降低计算效率。

3.其他语言的多线程

在其他语言,比如c++ 、c#、Java,没有类似于python的GIL设定,可以实现真正的多线程并行操作。即使针对计算密集型任务,也可以通过多个任务并行,来实现加速的效果。

4.如何解决假的多线程

  • 使用多进程:Python 的 multiprocessing 模块允许创建多个进程,每个进程都有自己独立的解释器和内存空间,因此能够充分利用多核 CPU。
  • 使用并行计算库:例如 concurrent.futures 模块中的 ThreadPoolExecutor 和 ProcessPoolExecutor 类,或者第三方库如Dask、joblib 等,它们能够在多个核心上并行执行任务。
  • 使用 C 扩展或者 Cython:将性能关键部分用 C 或 Cython 编写,可以绕过 GIL 的限制,从而实现更好的并行性能。

相关文章:

python全局解释器锁(GIL)

文章目录 1.cpu工作方式2.python全局解释器锁与多线程3.其他语言的多线程4.如何解决假的多线程 1.cpu工作方式 先来先服务(First Come, First Served,FCFS): 最简单的调度算法,按照作业或进程到达的顺序依次执行。没有…...

无人机的起源

无人机起源于20世纪初的早期实验阶段,并随着技术进步逐步发展。无人机,作为现代科技领域中的一项重要创新,已经在全球范围内展现出其巨大的潜力和应用价值。 无人机的历史可以追溯到1917年,美国人艾德温.奥斯特林发明了“飞行训练…...

专题六:Spring源码之初始化容器BeanFactory

上一篇咱们通过一个例子介绍初始化容器上下文相关内容,并通过两个示例代码看到了Spring在设计阶段为我预留的扩展点,和我们应该如何利用这两个扩展点在Spring初始化容器上下文阶段为我们提供服务。这一篇咱们接着往下看。 老这样子下回到refresh方法上来…...

缓存双写一致性(笔记)

缓存更新方案 旁路缓存模式 这是比较多的 旁路缓存模式:缓存有就返回,没有数据库查询,放入缓存返回。 还有些常用缓存策略 读穿透模式 读穿透和旁路很相似,程序不需要关注从哪里读取数据,它只需要从缓存查询数据。…...

运动馆预约管理系统设计

设计一个运动馆预约管理系统,需要考虑到用户需求、系统功能、技术实现和用户体验等多个方面。以下是一个基本的设计框架: 1. 系统目标 提供便捷的运动场地预约服务。 实现运动馆资源的有效管理和利用。 支持在线支付,提高交易效率。 提供数…...

第五届计算机、大数据与人工智能国际会议(ICCBD+AI 2024)

随着科技的飞速发展,计算机、大数据和人工智能等前沿技术已成为推动社会进步的重要力量。为了加强这一领域的学术交流与合作,促进技术创新与发展,第五届计算机、大数据与人工智能国际会议(ICCBDAI 2024)将于2024年11月…...

高效的向量搜索算法——分层可导航小世界图(HNSW)

最近在接触大模型相关内容,发现一种高效的向量搜索算法HNSW,这里做一下记录。 在之前自己也接触过一段时间的复杂网络(网络科学),没想到,将网络科学的思想引入到向量搜索算法中,可以产生令人眼前…...

【MySQL备份】Percona XtraBackup全量备份实战篇

目录 1. 前言 2.准备工作 2.1.环境信息 2.2.创建备份目录 2.3.配置/etc/my.cnf文件 2.4.授予root用户BACKUP_ADMIN权限 3.全量备份 4.准备备份 5.数据恢复 6.总结 "实战演练:利用Percona XtraBackup执行MySQL全量备份操作详解" 1. 前言 本文…...

港口危险货物安全管理人员考试题库(含答案)

一、单选题 1.化学品安全标签内容中警示词有( )种分别进行危害程度的警示。 A、3 B、4 C、5 参考答案:A 2.运输放射性物品,应当使用( )的放射性物品运输包装容器(以下简称运输容器)。 A、专业 B、专用 C、统一 D、定制 参考答案:B 3.库区仪表及计算机监控管理系…...

什么是 JVM( Java 虚拟机),它在 Java 程序执行中扮演什么角色?

JVM,全称Java Virtual Machine,中文译作“Java虚拟机”,它是运行Java程序的软件环境,也是Java语言的核心部分之一。 想象一下,如果你是一位环球旅行家,每到一个新的国家,都需要学习当地的语言才…...

Python容器 之 列表--下标和切片

列表的切片 得到是 新的列表字符串的切片 得到是 新的字符串 如果下标 不存在会报错 list1 [1, 3.14, "hello", False] print(list1)# 获取 列表中 第一个数据 print(list1[0]) # 1# 获取列表中的最后一个数据 print(list1[-1]) # [False]# 获取中间两个数 即 3.1…...

Docker 运行Nacos无法访问地址解决方法

参考我的上一篇文章去配置好镜像加速器,镜像加速器不是配置越多越好,重试次数多了会失败 Dockerhub无法拉取镜像配置阿里镜像加速器-CSDN博客 错误的尝试 最开始按照网上的方式去配了一大堆,发现下不下来。 镜像源地址:https:…...

Stable Diffusion 商业变现与绘画大模型多场景实战

前言 ai绘画软件Stable Diffusion是一种通过模拟扩散过程,将噪声图像转化为目标图像的文生图模型,具有较强的稳定性和可控性,可以将文本信息自动转换成高质量、高分辨率且视觉效果良好、多样化的图像。在日常工作中,ai绘画软件St…...

[CocosCreator]CocosCreator网络通信:https + websocket + protobuf

环境 cocos creator版本:3.8.0 开发语言:ts 操作系统:windows http部分 直接使用 XMLHttpRequest 创建http请求 // _getHttpUrl 方法自己写字符串拼接public httpPostJsonRequest(uri: string, headData: any, data: any, cb: Function…...

并发控制-事务的调度、数据不一致问题(更新丢失、脏读、不可重复读)、非串行调度的的可串行化

一、引言 1、数据库管理系统DBMS的事务处理技术实现的另一个主要功能部分是并发控制机制。并发控制机制完成的功能就是对并发执行的事务进行控制,保证事务的隔离性,从而进一步保持数据库的一致性。 2、事务的并发控制就是对并发执行的不同事务中的数据…...

Golang | Leetcode Golang题解之第202题快乐数

题目: 题解: func isHappy(n int) bool {cycle : map[int]bool{4: true, 6: true, 37: true, 58: true, 89: true, 145: true, 42: true, 20: true}for n ! 1 && !cycle[n] {n step(n)}return n 1 }func step(n int) int {sum : 0for n > …...

算法:哈希表

目录 题目一:两数之和 题目二:判定是否互为字符重排 题目三:存在重复元素I 题目四:存在重复元素II 题目五:字母异位词分组 关于哈希表 哈希表就是存储数据的容器 哈希表的优势是:快速查找某个元素O(…...

自然语言处理基本知识(1)

一 分词基础 NLP:搭建了计算机语言和人类语言之间的转换 1 精确分词,试图将句子最精确的分开,适合文本分析 >>> import jieba >>> content "工信处女干事每月经过下属科室" >>> jieba.cut(content,cut_all …...

Java中的数据加密与安全传输

Java中的数据加密与安全传输 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨一下在Java中如何实现数据加密与安全传输。 随着互联网的普及和网络…...

UG NX二次开发(C++)-根据草图创建拉伸特征(UFun+NXOpen)

1、前言 UG NX是基于特征的三维建模软件,其中拉伸特征是一个很重要的特征,有读者问如何根据草图创建拉伸特征,我在这篇博客中讲述一下草图创建拉伸特征的UG NX二次开发方法,感兴趣的可以加入QQ群:749492565,或者在评论区留言。 2、在UG NX中创建草图,然后创建拉伸特征 …...

TS_开发一个项目

目录 一、编译一个TS文件 1.安装TypeScript 2.创建TS文件 3.编译文件 4.用Webpack打包TS ①下载依赖 ②创建文件 ③启动项目 TypeScript是微软开发的一个开源的编程语言,通过在JavaScript的基础上添加静态类型定义构建而成。TypeScript通过TypeScript编译器或…...

2024年华为OD机试真题-传递悄悄话 -C++-OD统一考试(C卷D卷)

2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述: 给定一个二叉树,每个节点上站着一个人,节点数字表示父节点到该节点传递悄悄话需要花费的时间。 初始时,根节点所在位置的人有一个悄悄话想要传递给其他人,求二叉树所有节…...

eclipse基础工程配置( tomcat配置JRE环境)

文章目录 I eclipse1.1 工程配置1.2 编译工程1.3 添加 JRE for the project build pathII tomcat配置JRE环境2.1 Eclipse编辑tomcat运行环境(Mac版本)2.2 Eclipse编辑tomcat运行环境(windows版本)2.3 通过tomcat7W.exe配置运行环境(windows系统)I eclipse 1.1 工程配置 …...

Spring Boot 学习第八天:AOP代理机制对性能的影响

1 概述 在讨论动态代理机制时,一个不可避免的话题是性能。无论采用JDK动态代理还是CGLIB动态代理,本质上都是在原有目标对象上进行了封装和转换,这个过程需要消耗资源和性能。而JDK和CGLIB动态代理的内部实现过程本身也存在很大差异。下面将讨…...

Linux[高级管理]——Squid代理服务器的部署和应用(传统模式详解)

🏡作者主页:点击! 👨‍💻Linux高级管理专栏:点击! ⏰️创作时间:2024年6月24日11点11分 🀄️文章质量:95分 目录 ————前言———— Squid功能 Squ…...

使用Vue 2 + Element UI搭建后台管理系统框架实战教程

后台管理系统作为企业内部的核心业务平台,其界面的易用性和功能性至关重要。Vue 2作为一个成熟的前端框架,以其轻量级和高效著称,而Element UI则是一套专为桌面端设计的Vue 2组件库,它提供了丰富的UI元素和组件,大大简…...

Carla安装教程

1.前言 对于从事自动驾驶的小伙伴而言,或多或少应该都接触过一些的仿真软件,今天要给大家介绍的这款仿真软件应该算的上是业界非常有名的一款仿真软件——carla。 目前carla的学习教程也还是蛮多的,但是写的都不是很全,在配置的…...

【PYG】处理Cora数据集分类任务使用的几个函数log_softmax,nll_loss和argmax

文章目录 log_softmax解释作用示例解释输出 nll_loss解释具体操作示例代码解释 nll_losslog_softmaxcross_entropy解释代码示例解释 argmax()解释作用示例代码解释示例输出 log_softmax F.log_softmax(x, dim1) 是 PyTorch 中的一个函数,用于对输入张量 x 应用 log…...

Labview绘制柱状图

废话不多说,直接上图 我喜欢用NXG风格,这里我个人选的是xy图。 点击箭头指的地方 选择直方图 插值选择第一个 直方图类型我选的是第二个效果如图。 程序部分如图。 最后吐槽一句,现在看CSDN好多文章都要收费了,哪怕一些简单的入…...

使用Python实现一个简单的密码管理器

文章目录 一、项目概述二、实现步骤2.1 安装必要的库2.2 设计密码数据结构2.3 实现密码加密和解密2.4 实现主要功能2.4.1 添加新密码2.4.2 显示所有密码2.4.3 查找特定密码2.4.4 更新密码2.4.5 删除密码 2.5 实现用户界面 三、代码示例3.1 加密和解密示例3.2 用户界面示例 在现…...