首页 > 系统相关 >什么是gil锁、python的垃圾回收机制是什么样的?解释为什么计算密集型用多进程,io密集型用多线程

什么是gil锁、python的垃圾回收机制是什么样的?解释为什么计算密集型用多进程,io密集型用多线程

时间:2023-08-01 18:56:23浏览次数:43  
标签:多线程 回收 密集型 io 进程 线程 gil

目录

1 什么是gil锁

-全局解释器锁:

它的本质就是一个大的互斥锁,它是cpython的一个机制,gil只存在于cpython解释器,它限制了一个线程只有获取到了gil锁,才能执行,如果没有拿到gil锁,线程是不能执行的
-解释器不仅仅只有cpython,pypy,jpython

gil锁的作用是什么?

-限制线程只有获得到它才能执行

为什么要有gil锁?

-保证数据安全? 用互斥锁就可以了,gil锁不能保证数据安全
   python的垃圾回收机制,需要垃圾回收线程来做,如果同一时刻,有多个线程在同时执行,垃圾回收就可能会把正在其他线程使用的变量给回收掉,因为当时只有单核电脑,本来统一时刻就不能有多个线程同时执行,于是作者就干脆做了一个gil锁,让线程必须获得到gil锁,才能执行,但后来随着多核的出现,导致python的多线程并不能利用多核

2 python的垃圾回收机制是什么样的?

-高级一点的语言,为了保证内存的使用效率,都会有垃圾回收的机制,而咱们python使用以下三种方式来做垃圾回收

-引用计数

-有多少个变量指向它,它的引用计数就为几,当引用计数为0,说明没有变量指向它了,这块内存空间就会被回收掉
    -引用计数存在问题:循环引用问题   

-标记清除

-是为了解决引用计数存在的循环引用问题的
    -第一阶段是标记阶段,它会把所有的『活动对象』打上标记,第二阶段是把那些没有标记的对象『非活动对象』进行回收
    -它会把循环引用的内存空间,打上标记,然后回收掉

-分代回收

-把对象分为三代,一开始,对象在创建的时候,放在一代中,如果在一次一代的垃圾回收检查中,该对象存活下来,就会被放到二代中,同理在一次二代的垃圾检查中,该对象存活下来,就会被放到三代中,后面优先检查第一代中的对象,优先回收,其次依次往上检查做回收

3 解释为什么计算密集型用多进程,io密集型用多线程

计算密集型任务:

计算密集型任务是指那些需要大量 CPU 计算资源的任务,例如复杂的数学运算、图像处理、加密解密等。这类任务主要消耗 CPU 时间,而不涉及大量的数据读写操作。对于计算密集型任务,使用多进程可以充分利用多个 CPU 核心,因为每个进程都在独立的地址空间中运行,不会受到 GIL的限制。每个进程都有自己的 GIL,因此可以在多个 CPU 核心上并行执行任务,从而提高整体计算性能。

I/O 密集型任务:

I/O 密集型任务是指那些涉及大量 I/O 操作的任务,例如文件读写、网络通信、数据库访问等。在这类任务中,CPU 等待数据的读写操作完成时会处于空闲状态,浪费了大量的计算资源。对于 I/O 密集型任务,使用多线程更为适合,因为线程之间共享同一个进程的地址空间,可以共享数据和资源,同时一个线程在进行 I/O 操作时,其他线程仍然可以继续执行,提高了 CPU 的利用率。

总结:

计算密集型任务适合使用多进程,可以充分利用多核 CPU 并行计算,提高计算性能。
I/O 密集型任务适合使用多线程,可以在等待 I/O 操作的时候利用 CPU 执行其他任务,提高整体效率。
需要注意的是,在 Python 中,由于 GIL 的存在,多线程并不适合用于 CPU 密集型任务。如果在 Python 中处理计算密集型任务,应该选择使用多进程来充分发挥多核 CPU 的性能。
-由于GIL锁的存在,即便是多核机器,同一时刻,也只能有一个线程在执行
-线程需要cpu去调度执行
-如果开了多线程,是计算密集型,计算是消耗cpu,假设是四核电脑,不能充分利用这四个核,只能有一个核在执行,开多线程没有用
-而如果计算密集型,开了多进程,gil是在cpython解释器进程中的,再进程中开启线程执行计算,可以充分利用多核优势
-开了一个进程,就开了一个cpython解释器的进程,就会有一个gil锁

由于GIL锁的存在,即便是多核机器,同一时刻,也只能有一个线程在执行
线程需要cpu去调度执行
如果开了多线程,是计算密集型,计算是消耗cpu,假设是四核电脑,不能充分利用这四个核,只能有一个核在执行,开多线程没有用
而如果计算密集型,开了多进程,gil是在cpython解释器进程中的,再进程中开启线程执行计算,可以充分利用多核优势
开了一个进程,就开了一个cpython解释器的进程,就会有一个gil锁

由于GIL锁的存在,如果是计算密集型,开启多线程,不能利用多核优势,
开启多进程,可以利用多核优势
io不耗费cpu,开启多线程,在一个时间段内是有并发效果的


即便是io密集型,用多进程是不是会显著提高效率?
	本身开启进程是非常消耗资源的,如果是io密集型,没有必要开多进程,并不会有显著的效率提升

标签:多线程,回收,密集型,io,进程,线程,gil
From: https://www.cnblogs.com/yuezongke/p/17598789.html

相关文章

  • 如何在Windows上将iOS应用上传到App Store
     ApplicationUploaderiOSApp上架工具是一款非常好用的针对iOS苹果应用程序软件开发的实用编程工具,它的主要作用是帮助用户进行快速的程序应用设计和程序应用调试,节省用户进行软件开发耗费的不必要时间!​编辑切换为居中添加图片注释,不超过140字(可选......
  • windows如何上架ios应用到app store
    windows如何上架ios应用到appstoreApplicationUploaderiOSApp上架工具是一款非常好用的针对iOS苹果应用程序软件开发的实用编程工具,它的主要作用是帮助用户进行快速的程序应用设计和程序应用调试,节省用户进行软件开发耗费的不必要时间!​编辑切换为居中......
  • IO模型
    1.同步和异步同步和异步指的是两个函数之间的关系同步:A调用B,A必须得到B返回的结果才能干其它事。异步:A调用B,同时提供给B一个函数,即回调函数,此时A没有得到任何结果继续执行,B在执行完成后,调用A提供的函数告知A。定义:和同步相对,发出异步调用后,调用者在没有得到结果之前,就可以继......
  • TDengine连接数满了报错:Connection is not available, request timed out after 3000
    背景使用tdengine时遇到一个情况,应用程序使用连接池将接收到的实时数据插入TD时,会出现获取不到连接的报错.重现起一个模拟程序,发送100条数据到应用程序,应用程序从批量插入改为逐条插入td,重现出报错:org.springframework.jdbc.support.MetaDataAccessException:Could......
  • CronExpression 表达式详解
    参数名有效值Seconds(秒)可以用数字0~59表示Minutes(分)可以用数字0~59表示Hours(时)可以用数字0~23表示Day-of-Month(日)可以用数字1~31中的任一个值,但要注意一些特别的月份Month(月)可以用0~11或用字符串JAN,FEB,MAR,APR,MAY,JUN,JU......
  • JavaIO流
    JavaIO流基础概念数据流:一组有序,有起点和终点的字节的数据序列。包括输入流和输出流输入流:程序从输入流读取数据源。数据源包括外界(键盘、文件、网络…),即是将数据源读入到程序的通信通道输出流:程序向输出流写入数据。将程序中的数据输出到外界(显示器、打......
  • pdd.order.information.get拼多多店铺订单详情接口(店铺订单交易接口,店铺订单明文接口
    pdd.order.information.get拼多多店铺订单详情接口(店铺订单交易接口,店铺订单明文接口,店铺订单解密接口)代码对接教程如下:1.公共参数参数名称参数类型是否必填参数描述(接口代码教程wx19970108018)typeString必填API接口名称(点击获取请求key和secret)client_idString必填POP分配给应......
  • WPF使用FluentValidation进行表单验证
    WPF使用FluentValidation进行表单验证.net版本:6.0使用的NuGet包FluentValidation:11.6.0MaterialDesignThemes:4.9.0Prism.DryIoc:8.1.97在WPF里验证表单使用的是INotifyDataErrorInfo接口,这个接口长这样publicinterfaceINotifyDataErrorInfo{boolHasErrors{get;......
  • SpringBoot如何获取IOC容器以及修改Bean
    通过ApplicationContextAware来获得ApplicationContext,然后获取相关Bean进行操作举例说明@ConfigurationpublicclassCommonConfigimplementsApplicationContextAware{@OverridepublicvoidsetApplicationContext(ApplicationContextapplicationContext)throw......
  • 报错:WARNING: cannot load logging configuration file, logging is disabled
    问题:在webots里使用rospy时报warning。分析:无解决方案:参考https://blog.csdn.net/ckkboy/article/details/985048801.在/etc/下创建ros目录cd/etc/sudomkdirros2.将python_logging.conf文件复制到/etc/ros/下sudocp/opt/ros/melodic/etc/ros/python_log......