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 的限制,从而实现更好的并行性能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端基础:CSS(篇一)

目录 css概述 CSS与HTML的关系 基本语法 行内样式表 代码 运行 内嵌样式表 代码 运行 外部样式表 代码 运行 选择器 标签选择器 代码 运行 id选择器 代码 运行 类选择器 代码 运行 选择器优先问题 通配选择器 选中所有的标签 代码 运行 选择器组…

2-22 基于matlab的NSGA-2求解多目标柔性车间调度算法

基于matlab的NSGA-2求解多目标柔性车间调度算法,计算最大完工时间、计算总延期时长、计算调度方案的总能耗、计算设备总负荷。输出四项结果,多次运行可寻找最佳的调度计划。程序已调通,可直接运行。 2-22 NSGA-2求解多目标柔性车间调度算法 - 小红书 (xi…

Java - 程序员面试笔记记录 实现 - Part2

2.1 输入输出流 流可以被看作一组有序的字节集合,即数据在两个设备间的传输。 字节流:以字节作为单位,读到一个字节就返回一个字节;InputStream & OutputStream。 字符流:使用字节流读到一个到多个字节先查询码…

传输距离3000M|低延迟|48K采样音频传输模块-SA356大功率发射模块

无线音频应用中,远距离音频传输在许多领域具有广泛的应用需求,例如大型会议系统、公共广播、户外活动和音乐演出等。为了满足这些需求,音频传输模块需要具备一些关键特性,包括长距离传输能力、高音质、低延迟、稳定性以及抗干扰能…

【第11章】MyBatis-Plus条件构造器(上)

文章目录 前言一、功能详解1. allEq2. eq3. ne4. gt5. ge6. lt7. le8. between9. notBetween10. like11. notLike12. likeLeft13. likeRight14. notLikeLeft15. notLikeRight16. isNull17. in18. notIn19. inSql20. notInSql21. eqSqlSince 3.5.622. gtSql Since 3.4.3.223. ge…

【CentOS7.6】yum 报错:Could not retrieve mirrorlist http://mirrorlist.centos.org

一、报错 1.报错内容如下 在使用 yum makecache 命令时报错,在 yum install -y xxx 的时候报错等等 [roothcss-ecs-a901 yum.repos.d]# yum makecache Loaded plugins: fastestmirror Determining fastest mirrors Could not retrieve mirrorlist http://mirrorl…

【鸿蒙学习笔记】Column迭代完备

属性含义介绍 Column({ space: 10 }) {Row() {Text(文本描述).size({ width: 80%, height: 60 }).backgroundColor(Color.Red)}.width(90%).height(90).backgroundColor(Color.Yellow) } .width(100%) // 宽度 .height(200) // 高度 .backgroundColor(Color.Pink) // 背景色 .…

【深圳大学算法设计与分析】 实验六 最大流应用问题 FF -> EK -> Dinic

目录 一、实验目的: 二、内容:棒球赛问题 三、实验要求 四、提交要求 ———————— 问题分析解释: ———————— 算法简解: Ford–Fulkerson 增广 Edmonds–Karp 算法 Dinic算法 Dinic和EK的区别: …

STM32第十四课:低功耗模式和RTC实时时钟

文章目录 需求一、低功耗模式1.睡眠模式2.停止模式3.待机模式 二、RTC实现实时时钟1.寄存器配置流程2.标准库开发3.主函数调用 三、需求实现代码 需求 1.实现睡眠模式、停止模式和待机模式。 2.实现RTC实时时间显示。 一、低功耗模式 电源对电子设备的重要性不言而喻&#xff…

【程序大侠传】异步架构应用回调数据接收接口偶发NPE

前序 在这片浩瀚的代码江湖中,各大门派林立,各自修炼独门绝技,江湖中的侠士们分别担任着开发、测试、产品和运维的角色,共同守护着这片数字化的疆域。 开发门派:代码剑宗 代码剑宗的弟子们精通各种编程语言&#xff…

【嵌入式】探索嵌入式世界:在ARM上构建俄罗斯方块游戏的奇妙之旅

文章目录 前言:1. 简介2. 总体设计思路及功能描述2.1 设计思路2.2 功能描述2.3 程序流程图 3. 各部分程序功能及详细说明3.1 游戏界面函数3.1.1 游戏界面中的图片显示3.1.2 游戏开始界面3.1.3 游戏主界面3.1.4 游戏结束广告界面3.1.5 游戏界面中的触摸反馈3.1.6 游戏…

【Spring Boot】基于 JPA 开发的文章管理系统(CRUD)

基于 JPA 开发的文章管理系统(CRUD) 1.实现文章实体2.实现数据持久层3.实现服务接口和服务接口的实现类3.1 创建服务接口3.2 编写服务接口的实现 4.实现增、删、改、查的控制层 API 功能4.1 获取文章列表4.2 根据 id 获取文章对象4.3 新增4.4 保存4.5 删…

第三届环境工程与可持续能源国际会议(EESE 2024)

随着全球气候变化和环境问题日益严峻,环境工程与可持续能源领域的研究和发展显得尤为重要。第三届环境工程与可持续能源国际会议(EESE 2024)作为这一领域的重要交流平台,将于2024年10月25日至27日在湖南长沙盛大召开。本次会议将汇…

算法实验2.2、2.3

2.2主要内容 比较快速排序&#xff0c;归并排序以及堆排序算法的时间效率。了解影响算法执行时间的 主要因素以及如何降低算法的执行时间。 #include<iostream> using namespace std; #include<stdio.h> #include<malloc.h> #include<stdlib.h> #inc…

vue全局方法plugins/utils

一、在src目录下创建一个plugins文件夹 test.ts文件存放创建的方法&#xff0c;index.ts用于接收所有自定义方法进行统一处理 二、编写自定义方法 // test.ts文件 export default {handleTest(val1: number, val2: number) {// 只是一个求和的方法return val1 val2;}, };三…

MySQL数据库的主从复制与读写分离

一、MySQL数据库的主从复制 1.主从复制的概述及原理 &#xff08;1&#xff09;主从复制的意义 在实际的生产环境中&#xff0c;如果对数据库的读和写都在同一个数据库服务器中操作,无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此&#xff…

【Nvidia+AI相机】涂布视觉检测方案专注提高锂电池质量把控标准

锂电池单元的质量在多个生产制造领域都至关重要&#xff0c;特别是在新能源汽车、高端消费电子等行业。这些领域的产品高度依赖锂电池提供持续、稳定的能量供应。优质的锂电池单元不仅能提升产品的性能和用户体验&#xff0c;还能确保使用安全。因此&#xff0c;保证锂电池单元…

微信小程序template模板引入

如图&#xff1a;temp.wxml是template引入的模板 在two.wxml中&#xff1a; import&#xff1a;是引入temp的页面让template中的内容显示出来在two页面中&#xff1b; include:是显示temp页面内容不在template包裹&#xff0c;template以外的view标签文字和不在view的文字让…

探索PcapPlusPlus开源库:网络数据包处理与性能优化

文章目录 0. 本文概要1. PcapPlusPlus介绍1.1 概述1.2主要特性和功能1.3 PcapPlusPlus 主要模块关系和依赖1.4 网络协议层处理过程 2. 实例2.1 基于 PcapPlusPlus 的应用程序设计和封装流程&#xff1a;2.2 多线程示例代码2.3 代码说明&#xff1a; 3. 程序性能进一步优化3.1 避…