• GIL全局解释器锁


    GIL全局解释器锁

    1. 什么是GIL全局解释器锁
        GIL本质就是一把互斥锁,相当于执行权限,每个进程内都会存在一把GIL,同一进程内的多个线程
    必须抢到GIL之后才能使用Cpython解释器来执行自己的代码,即同一进程下的多个线程无法实现并行
    但是可以实现并发

    在Cpython解释器下,如果想实现并行可以开启多个进程

    2. 为何要有GIL
    因为Cpython解释器的垃圾回收机制不是线程安全的

    3. 如何用GIL
    有了GIL,应该如何处理并发

    进程:资源单位
    线程:代码的运行过程
    互斥锁:把多个任务对共享数据的修改,由并发变成串行,牺牲效率保证数据安全
    from threading import Thread  #线程
    import time
    
    def task(name):
        print('%s is running' %name)
        time.sleep(2)
    
    if __name__ == '__main__':
        t1=Thread(target=task,args=('线程1',))
        t2=Thread(target=task,args=('线程2',))
        t3=Thread(target=task,args=('线程3',))
        t1.start()
        t2.start()
        t3.start()
    结果:
    线程1 is running
    线程2 is running
    线程3 is running
    举例

    计算密集型:应该使用多进程

    from multiprocessing import Process
    from threading import Thread
    import os,time
    
    def work():
        res=0
        for i in range(10000):
            res*=i
    
    if __name__ == '__main__':
        l=[]
        # print(os.cpu_count())
        start=time.time()
        for i in range(6):
            p=Process(target=work)    #run time is 1.0090382099151611
            # p=Thread(target=work)   #run time is 0.012500286102294922
            l.append(p)
            p.start()
        for p in l:
            p.join()
        stop=time.time()
        print('run time is %s' %(stop-start))
    举例

    io密集型:应该使用多线程

    from multiprocessing import Process
    from threading import Thread
    import threading
    import os,time
    def work():
        time.sleep(2)
    
    if __name__ == '__main__':
        l=[]
        start=time.time()
        for i in range(100):
            p=Process(target=work) #41.31889200210571
            # p=Thread(target=work) #2.0850322246551514
            l.append(p)
            p.start()
        for p in l:
            p.join()
        stop=time.time()
        print('run time is %s' %(stop-start))
    举例
     
  • 相关阅读:
    strcmp()比较函数和strcasecmp()和strnatcmp()
    substr()函数
    改变字符串中的字母大小写
    explode()与相反函数 implode() 和join()
    PHP nl2br() 函数
    PHP trim() 函数
    PHP的count(数组)和strlen(字符串)的内部实现
    变量处理函数库
    php中定义数组的方法
    80端口的烦恼:[3]清除NT Kernel占用80端口
  • 原文地址:https://www.cnblogs.com/zhouhao123/p/11220147.html
Copyright © 2020-2023  润新知