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事件
线程间状态同步