首页 > 系统相关 >GIL锁;python垃圾回收机制;计算密集型用多进程,io密集型用多线程

GIL锁;python垃圾回收机制;计算密集型用多进程,io密集型用多线程

时间:2023-08-02 16:23:12浏览次数:31  
标签:GIL 对象 回收 python 线程 垃圾 io 密集型 多线程

GIL锁;python垃圾回收机制;计算密集型用多进程,io密集型用多线程

GIL锁及其作用

1.GIL(Global Interpreter Lock)又称全局解释器锁,本质就是一个互斥锁。
2.它保证了cpython进程中的每个线程必须获得这把锁才能执行,不获得不能执行
3.这样使得在同一进程内任何时刻仅有一个线程在执行。
4.GIL锁只针对于cpython解释器

为什么不用其他python解释器

Jython、Pypy、IronPython没有GIL锁,Pypy速度更快
因为python代码运行在python解释器上,python解释器相当于地基,我们在地基上面盖楼,如果用Pypy的话,有很多模块用不了,Django也无法使用

为什么要有GIL锁

-python是动态强类型语言,因为有垃圾回收机制,如果同一个进程下有多个线程同时在执行,垃圾回收是垃圾回收线程【同一个进程下变量是共享的】,该线程做垃圾回收时,如果其他线程在运行,就可能会出并发安全的问题【数据安全的问题】,由于当时,只有单核cup【即便开启多线程,同一时刻,也只有一个线程在运行】,作者就强行做了一个GIL锁,保证在一个进程内,同一时刻只有一个线程执行,目的是为了防止垃圾回收线程做垃圾回收时,出现数据紊乱问题,所以加了gil锁

-垃圾回收是垃圾回收线程,它在执行的时候,其他线程是不能执行的,而限于当时的条件,只有单核cpu,所以作者直接做了个GIL锁,保证一个进程内同一时刻只有一个线程在执行

python垃圾回收机制

# 什么是垃圾回收
-编程语言在运行过程中会定义变量,也会申请内存空间,后期变量不需要了,该内存空间应该被释放掉
-有些编程语言的这个操作需要程序员自己做(c)
-像java、python、go这些语言都自带GC机制,可以自动回收内存空间
-不同语言的GC方式不一样,python使用如下3种方式,1为主,2、3为辅

1. 引用计数(Reference Counting):
   引用计数是Python垃圾回收的基础机制。当一个对象被创建时,Python会为该对象的引用计数设为1。每当一个变量引用该对象,它的引用计数就会增加1;当变量不再引用该对象(比如变量被删除、重新赋值为其他对象、离开作用域等),对象的引用计数就会减少1。当对象的引用计数减少到0时,说明该对象没有被任何变量引用,即成为垃圾对象,垃圾回收线程会立即释放该对象占用的内存。
'''有问题:循环引用问题回收不了'''

2. 标记清除(Mark and Sweep):
'''解决引用计数无法回收循环引用的问题'''
   当垃圾回收器(garbage collector)被触发时,它会从根对象(通常是全局变量和当前调用栈)出发,遍历所有可访问对象,并对可访问到的对象进行标记。然后,垃圾回收器会清除所有未被标记的对象,这些对象即为不可达的垃圾对象,它们的内存会被释放。
   标记清除的优点是可以解决循环引用的问题,但在进行标记和清除操作时会暂停程序的运行,可能会造成一定的性能损失。

3. 分代回收(Generational Garbage Collection):
'''解决垃圾回收效率问题'''
   它基于这样的观察:大部分对象在内存中存在的时间很短,而只有少数对象会长时间存活。因此,Python将对象按照存活时间划分为不同的代(generation)。一般来说,Python将对象分为三代:0代、1代和2代。新创建的对象属于0代,当0代对象经过垃圾回收后仍然存活,它就会被提升到1代;同理,1代对象经过垃圾回收后仍然存活,就会被提升到2代。Python的垃圾回收器采用不同的频率对不同代的对象进行回收
   分代回收的优点是,它可以根据对象的存活时间来有选择性地进行垃圾回收。通常情况下,大部分垃圾都集中在0代,因此只对0代进行垃圾回收可以更快地完成回收操作,减少全局扫描的开销。减少了全局扫描的开销,提高了垃圾回收的效率

计算密集型用多进程,io密集型用多线程

'''只针对cpython解释器,其他语言都开多线程即可,能够利用多核CPU优势'''
-计算是消耗CPU的:数值计算、图像处理、加密解密都是计算

-io不消耗CPU:文件读写、网络通信、数据库查询等,如果遇到io,该线程会释放CPU的执行权限,CPU转而去执行别的线程

-由于python有GIL锁,开启多线程的话同一时刻只有一条线程在执行

-如果是计算密集型,开了多线程,同一时刻只有一个线程在执行。多核CPU会浪费多核优势,我们希望多个核(cpu),都干活,而同一个进程下绕不过GIL锁。所以我们开启多进程,GIL锁只能锁住某个进程中得线程,开启多个进程,就能利用多核优势
。
-进程内开了多个io线程,线程多半都在等待,开启多进程是不能提高效率的,反而开启进程很耗费资源,所以使用多线程即可


标签:GIL,对象,回收,python,线程,垃圾,io,密集型,多线程
From: https://www.cnblogs.com/10086upup/p/17600996.html

相关文章

  • flask as_view源码,请求响应,cookie,session
    1CBV1cbv写法 -1写个类,继承MethodView-2在类中写跟请求方式同名的方法-3注册路由:app.add_url_rule('/home',view_func=Home.as_view('home'))#home是endpoint,就是路由别名2cbv加装饰器 -方式一: classHome(MethodView): decorators=[auth]#......
  • VIOOVI数字IE技术:引领制造业智能化升级的关键
    随着科技的不断发展和制造业的竞争日益激烈,企业迫切需要普及数字IE技术,夯实制造基础。VIOOVI自主研发的ECRS工时分析软件,在国内现场基层管理和改善中填补了数字工具软件的空白,为企业带来了真正的创造价值、效率和产能数据。 传统的基层管理和改善工作一直缺少专属的数字化工具软件......
  • Dao继承JpaRepository 、 JpaSpecificationExecutor 接口
    @RepositorypublicinterfaceUserRepositoryextendsJpaRepository<User,Integer>{xxx...}关于Dao继承JpaRepository:前要:Jpa:JPA是Spring提供的一种ORM,ORM:对象关系映射(ObjectRelationalMapping,简称ORM),简单的说,ORM是通过使用描述对象和数据库之间映射的......
  • VIOOVI数字工时软件:助力制造业实现精益生产
    在当今竞争激烈的制造业中,企业需要不断寻求提升生产效益和降低成本的方法,以保持竞争优势。而数字工时作为一种重要的管理工具,为企业创造了全新的机遇,助力制造业实现精益生产和数字化转型。数字工时对于解决制造业智能化、精益化发展面临的基础问题至关重要。过去,工时难以准确测量,工......
  • [刷题笔记] Luogu P2340 [USACO03FALL] Cow Exhibition G
    ProblemSolution乍看可能没有思路。我们注意到本题是牵扯到一头奶牛选or不选的问题,非常自然地想到01背包。接下来我们就尝试将本题背景转换成01背包问题。我们可以将智商转换成容量,情商转换成价值。(当然反过来也可)然后就可以套用01背包板子了:\[f_{i,j}=min(f_{i-1,j},f_{i-1......
  • 解决 Vue 重复点击相同路由,出现 Uncaught (in promise) NavigationDuplicated: Avoide
    解决Vue重复点击相同路由,出现Uncaught(inpromise)NavigationDuplicated:Avoidedredundantnavigation问题问题问题描述:重复点击导航时,控制台出现报错,虽然不影响功能使用,但也不能视而不见。解决方案方案一:只需在router文件夹下,添加如下代码。constrouter=new......
  • C#中的System.AccessViolationException异常捕捉
    我们经常使用try-catch来捕捉异常,但从.NET4.0开始异常处理机制有所改变,导致AccessViolationException这类异常无法通过try-catch捕捉,而导致程序崩溃。官方解释AccessViolationException当代码尝试读取或写入尚未分配或无权访问的内存时,非托管或不安全代码中会发生访问冲突。这......
  • permission 权限
    权限开发概述权限列表ATM(AccessTokenManager)是HarmonyOS上基于AccessToken构建的统一的应用权限管理能力。默认情况下,应用只能访问有限的系统资源。但某些情况下,应用为了扩展功能的诉求,需要访问额外的系统或其他应用的数据(包括用户个人数据)、功能。系统或应用也必须以......
  • VisionOn 一款集流程图、思维导图、白板于一体的轻量级在线制图工具
    VisionOn一款集流程图、思维导图、白板于一体的轻量级在线图形工具在工作和学习过程中,通过可视化的图形,有助于清晰高效地表达我们的灵感、想法、思想。工欲善其事,必先利其器。目前,思维导图软件已经有Xmind、Mindnode、MindMeister、亿图图示、Gitmind,流程图软件包括Microso......
  • 宏基笔记本BIOS密码
    1、重启后马上按shift键今天高级设置/或者按F2进BIOS2宏碁bios默认密码8位是需要通过您自己的电脑查看的哦,每台电脑的密码都不一样的,具体的查询方法如下:1、开机启动的过程按F2键,进入输入BIOS密码的界面,输入三次错误密码,2、选择第一个EnterUnlockPassword。3、记录Key后面的8个......