zoukankan      html  css  js  c++  java
  • 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事件

    线程间状态同步

  • 相关阅读:
    浅谈面向对象语言中对象的使用
    淘宝店铺搜索工具(提升淘宝店铺排名人气)
    JavaScript学习总结二:js闭包(Closure)概念
    JavaScript学习总结一:js常见问题
    GC原理解析(c#)
    VS2010中的测试(2)——单元测试
    VS2010中的测试(3)——数据驱动单元测试
    领域驱动设计实践(二)
    俞敏洪在清华励志演讲
    Ioc最佳实践
  • 原文地址:https://www.cnblogs.com/einsam/p/11157509.html
Copyright © 2011-2022 走看看