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

发布时间 2023-08-01 18:49:03作者: 岳宗柯

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密集型,没有必要开多进程,并不会有显著的效率提升