• GIL与进程池线程池


    在 Cpython中,这个全局解释器锁 或者 称为GIL,是一个互斥锁. 是为了防止多个本地线程同一时间执行python字节码,

    这个锁是非常重要的因为Cpython的内存管理是非线程安全的, ,然而这个GIL有存在的必要性, 因为有很多已经存在的代码,需要依赖这个锁

    非线程安全 即 多个线程访问同一个资源,会有有问题

    线程安全 即 多个线程访问同一个资源,不会有问题

    CPython中有一个互斥锁,防止线程同一时间执行python代码

    该锁只存在Cpython中,这并不是Python这们语言的

    之所以使用Cpython的原因??

    C编译过的结果可以计算机直接识别

    最主要的语言,C语言以后大量现成的,库(算法,通讯),Cpython可以无缝连接C语言的任何现成代码

    加锁: 只有有一个线程要使用解释器就立马枷锁

    释放:

    该线程任务结束

    该线程遇到IO

    该线程使用解释器过长 默认100纳秒

    GIL给我们造成的影响

    多线程不能并行

    案例:

    有一个下载任务 要从网络中下载一个文件 大小1G

    和转换 任务 使用input 转为大写输出

    上述任务并行执行,耗时也不会有太大的提升,反而开启多进程会浪费更多资源

    这种任务称之为IO密集型,大量的时间都花在IO等待

    这类问题使用多线程,

    计算密集型任务

    图像处理,语音处理,大数据分析

    解决方案:

    区分任务类型

    如果是IO密集使用多线程

    如果是计算密集使用多进程

    GIL锁与自定义锁的关系

    都是互斥锁

    为什么有了GIL还需要自己加锁

    GIL是加在解释器上的,只能锁住,解释器内部的资源,但是无法锁住我们自己开启资源

     

    线程池与进程池 *****

    线程池

    池就是容器,

    线程池就是装线程的容器

    好处:

    1.自动管理线程的开启和销毁

    2.自动分配任务给空闲的线程

    3.可以线程开启线程的数量 保证系统稳定

    信号量中是限制同时并发多少,但是线程已经全都建完了

    如何使用:

    1.创建池子

    2.submit 提交任务

    3.pool.shutdown() # 等待所有任务全部完毕 销毁所有线程 后关闭线程池

    关闭后就不能提交新任务了

  • 相关阅读:
    int k=0;k=k++;结果等于0,为什么?
    CentOS在无法连接外网的服务器上安装软件(以docker为例)
    docker搭建 elasticsearch 集群
    docker容器之间进行网络通信
    Kafka集群搭建
    Zookeeper集群搭建及常用命令
    SpringBoot将Swagger2文档导出为markdown或html
    Linux(CentOS7)虚拟机修改 NAT模式固定IP
    Linux Maven私服(Nexus)搭建
    Linux配置开机自启动
  • 原文地址:https://www.cnblogs.com/huanghongzheng/p/10981742.html
Copyright © 2020-2023  润新知