zoukankan      html  css  js  c++  java
  • GIL全局解释器锁

    """
    In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple
    native threads from executing Python bytecodes at once. This lock is necessary mainly
    because CPython’s memory management is not thread-safe.
    """
    '''
    ps:python解释器有很多种,最常见的就是CPython解释器
    GIL本质就是一把互斥锁:将并发变成串行牺牲效率保证数据安全
    用来阻止同一个进程下的多个线程的同时执行(同一个进程内多个线程无法实现并行,但能并发
    
    GIL的存在就是因为CPython解释器的内存管理不是线程安全的
        为什么不安全呢?
            在Python解释器中有一个垃圾回收机制,那也是一串代码,也是一个进程,
            在并行时,可能会造成一个问题,其他线程变量名还没有赋值时,垃圾回收机制就将值回收了
            就会造成变量名找不到值
            所以需要并发
    GIL全局解释器锁是Python中特有的吗?
    不是在cpython中才有

        内存管理
        引用计数:值与变量的绑定关系的个数
        标记清除:当内存快要满的时候 会自动停止程序的运行 检测所有的变量与值的绑定关系
        给没有绑定关系的值打上标记,最后一次性清除
        分代回收:(垃圾回收机制也是需要消耗资源的,而正常一个程序的运行内部会使用到很多变量与值
        并且有一部分类似于常量,减少垃圾回收消耗的时间,应该对变量与值的绑定关系做一个分类
        ) 新生代(5S)》》》青春代(10s)》》》老年代(20s)
        垃圾回收机制扫描一定次数发现关系还在,会将该对关系移至下一代
        随着代数的递增 扫描频率是降低的

    
        
    研究python的多线程是否有用需要分情况讨论
    四个任务 计算密集型的 10s
    单核情况下
        开线程更省资源
    多核情况下
        开进程 10s
        开线程 40s
        
    四个任务 IO密集型的
    单核情况下
        开线程更省资源
    多核情况下
        开线程更省资源    
    
    '''
    # 计算密集型
    # from multiprocessing import Process
    # from threading import Thread
    # import os
    # import time
    # def work():
    #     res = 1
    #     for i in range(100000000):
    #         res *= i
    #
    #
    # if __name__ == '__main__':
    #     l = []
    #     print(os.cpu_count())  # 4核
    #     start_time = time.time()
    #
    #     for i in range(4):
    #         p = Process(target=work)  # 耗时10.977932214736938秒
    #         # p = Thread(target=work)  # 耗时22.046306133270264秒
    #         l.append(p)
    #         p.start()
    #     for i in l:
    #         i.join()
    #     print(time.time() - start_time)
    
    
    # IO密集型
    from multiprocessing import Process
    from threading import Thread
    import time
    import os
    
    
    def work():
        time.sleep(3)
    
    
    if __name__ == '__main__':
        l = []
        print(os.cpu_count())  # 本机4核 本机再算计算密集型就炸了
        start_time = time.time()
        for i in range(400):
            p = Process(target=work)  # 耗时36.039791107177734 大部分时间浪费在开辟内存中间上
            # p = Thread(target=work)  # 耗时3.0542681217193604秒
            l.append(p)
            p.start()
        for p in l:
            p.join()
        print(time.time() - start_time)
    
    '''
    pythyon的多线程到底有没有用
    需要分情况讨论
    在计算密集型上python处于弱势,但在IO密集型上Python还是很强的
    
    我们以后会用到多进程+多线程配合使用
    '''
    
    '''
    在开始我们也提到过GIL全局解释器锁本质就是一把互斥锁
        有些人就会认为有了GIL锁之后,我们在处理数据时,就不用加互斥锁了,
        实则不然,GIL全局解释器锁遇到IO时.cpu就会剥夺其使用权限,去执行其他的线程
        我们在处理数据时,就会遇到IO操作(比如网络延迟)所以我们需要使用到普通互斥锁,保证数据安全
    '''

  • 相关阅读:
    mysql8搭建innodb_cluster集群
    centos7安装(二进制包)mysql8
    apollo-配置管理中心-安装
    gitlab-源代码仓库
    Gitlab管理用户、组、权限(一)
    Gitlab基本管理(二)
    Gitlab基本管理<一>
    Gitlab在centos7上手工安装
    在kubernetes运行一个容器案例
    在linux通过kubeadm搭建kubernetes群集
  • 原文地址:https://www.cnblogs.com/asdaa/p/11353301.html
Copyright © 2011-2022 走看看