zoukankan      html  css  js  c++  java
  • 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)控制,这个锁就是用来保证
    同时只能有一个线程在运行.
    '''
  • 相关阅读:
    自定义 spark transformer 和 estimator 的范例
    spark 与 scikit-learn 机器学习流程组件设计哲学比较
    命名空间和作用域
    FeatureUnion 与 ColumnTransformer 关系
    注解与装饰器
    装饰器编写--要点
    闭包结构的本质
    SQL 自动增长 identity
    SQL 基本的函数
    int和long long有符号整形 负数比正数多一个
  • 原文地址:https://www.cnblogs.com/zhangboblogs/p/8634432.html
Copyright © 2011-2022 走看看