GIL锁

GIL

什么是GIL锁

全局解释器锁

在CPython中,全局解释器锁(GIL)是一个互斥锁,是为了阻止多个本地线程在同一时间执行python字节码,因为cpython的内存管理是非线程安全的,这个锁是非常必要的,因为他越来越多的特性依赖这个特性

为什么需要这把锁

线程安全问题具体的表现

cpython解释器与python程序之间的关系

python本质上就是一堆字符串,当运行一个python程序时,必须要开启一个解释器

在python程序中解释器只有一个,所有代码都要交给他来解释执行

当有多个线程都要执行代码时就会产生线程安全为题

cpython解释器与GC的问题

python会自动帮我们处理垃圾,清扫垃圾也是一堆代码,也需要开启一个线程来执行

就算程序没有自己开启线程,内部也有多个线程

GC线程与我们程序中的线程就会产生安全问题

例如:线程a要定义一个变量a

​ 步骤:先申请一块空间的内存,在把数据装进去,最后将引用计数加1

​ 如果在进行到 第二部 的时候,CPU切换到GC线程,GC就会把这个值当做垃圾,清理掉

带来的问题

GL就是一把互斥锁,互斥锁将导致效率降低

具体表现是在 cptyhon即使开启来多线程,而 CPU也是多核的,却 无法执行任务

因为解释器只有一个,同一时间只能有一个任务在执行

如何解决

没法解决,只能尽可能避免GL锁 影响我们的效率

1.使用多进程能够实现并行,从而更好利用多核CPU

2.对任务进行分区

​ (1)计算密集型:基本没有IO,大部分时间都在计算,如人脸识别,图像处理

​ 由于多线程不能并行,应该使用多进程,将任务分给不同CPU核心

​ (2)IO密集型:计算任务量非常少,大部分时间都在等 IO操作

​ 由于网络IO速度对比CPU处理速度非常慢,多线程并不会造成太大的影响

​ 如有大量客户端连接服务,进程开不起来,只能用多线程

性能讨论

之所以枷锁是为了解决线程安全问题

由于有了 锁,导致cpython中多线程并不能 并发

但不能因此否认python

1.python是一门语言,GL是cpython解释器 的问题

2.如果是单核CPU,GIL不会造成任何影响

3.由于目前大多数程序都是基于网络的,网络速度对比与CPU是非常慢的,导致即使多核CPU也无法提高效率

4.对于IO密集型,不会有太大影响

5.如果没有这把锁

GIL锁与自定义锁的区别

GIL锁住的是解释器级别 的数据

自定义锁的是解释器以外的共享资源,如硬盘文件,控制台,对于这种不属于解释器的数据资源,就应该自己加锁处理

线程池与进程池

池表示容器

线程池就是装线程的容器

为什么要装到容器中

1.可以避免频繁的创建和销毁(进程/线程)的资源开销

2.可以限制同时存在的线程数量,以保证服务器不会因资源 不足而导致的奔溃

3.帮我们管理来线程的生命周期

如果进程不结束,池子里的进程或线程也是一直存活的

同步异步

异步同步指的是提交任务的方式

同步:指的是提交任务后在原地等待直到任务结束

异步:指的是提交任务后不需要在原地等待可以继续往下执行代码

异步效率高于同步,异步 将导致任务发起方不知道任务何时处理完毕

解决方法:

Event事件

线程间状态同步

原文地址:https://www.cnblogs.com/einsam/p/11157509.html