• 21.线程,全局解释器锁(GIL)


    import time
    from threading import Thread
    from multiprocessing import Process
    #计数的方式消耗系统资源
    
    def two_hundred_million():
    
        start_time = time.time()
    
        i = 0
        for _ in range(200000000):
            i = i +1
    
        end_time = time.time()
    
        print("Total time:{}".format(end_time-start_time))
    
    def one_hundred_million():
    
        start_time = time.time()
    
        i = 0
        for _ in range(100000000):
            i = i +1
    
        end_time = time.time()
    
        print("Total time:{}".format(end_time-start_time))
    
    if __name__ == "__main__":
        #单线程--主线程
        # two_hundred_million()#Total time:15.068861722946167
    
        #多线程
        # for _ in range(2):
        #     t = Thread(target=one_hundred_million)
        #     t.start()
            #Total time:16.740957498550415
            #Total time:16.911967515945435
    
        #使用多进程避免GIL的影响
        '''
        multiprocess库的出现在很大程度是为了弥补thread库,
        因为GIL而低效率的缺陷,它完整的复制了一套thread提供的接口
        方便迁移,唯一的不同就是它使用了多进程而不是多线程,每个进程有自己独立的GIL
        因此不会出现进程之间的GIL争抢问题
        '''
        #多进程
        for _ in range(2):
            p = Process(target=one_hundred_million)
            p.start()
            #Total time:9.545545816421509
            #Total time:9.60754942893982
    
        #注意
        '''
        多进程的引入会增加程序实现时线程间数据通讯和同步的困难
        计数器:
        如果我们要使用多个线程累加同一变量,声明global变量,用thread.Lock()
        thread.release()包住全局变量.多进程不能使用同一个全局变量,只能通过
        Queue队列,put和get的方法来共享数据通讯.
        这就会产生额外的成本,使编程变得更加复杂
        '''
    
    #1.线程不常用,原因是底层有全局解释器锁
    '''
    python代码是由python虚拟机执行,(又叫解释器主循环),进行控制.
    python在设计的时候是这样考虑的,在主循环中同时只能由一个控制线程在执行
    就像单核CPU系统中的多进程一样,内存中可以有许多程序,但是在任意给定时刻,
    只能有一个程序在运行.同理,尽管python解释器中可以运行多个线程,但是
    在任意的给定时刻只有一个线程会被解释器执行
        对python虚拟机的访问是由全局解释器锁(GIL)控制,这个锁就是用来保证
    同时只能有一个线程在运行.
    '''
  • 相关阅读:
    渲染你刚刚上传的图片,再进行二次上传
    详情页需要显示图片
    上传图片
    毛利率保留俩位小数
    去除input的前后的空格
    vue下载模板、导出excle
    如何从一个对象里面拿数据
    登录注册
    ajax发送请求的数据类型
    WampServer修改MySQL密码
  • 原文地址:https://www.cnblogs.com/zhangboblogs/p/8634432.html
Copyright © 2020-2023  润新知