zoukankan      html  css  js  c++  java
  • Python 36 GIL全局解释器锁 、vs自定义互斥锁

    一:GIL全局解释器锁介绍

    CPython中,全局解释器锁(或GIL)是一个互斥锁, 它阻止多个本机线程同时执行Python字节码。译文:之所以需要这个锁, 主要是因为CPython的内存管理不是线程安全的。(然而,由于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=('线程1',))
        t3=Thread(target=task,args=('线程1',))
        t1.start()
        t2.start()
        t3.start()
    View Code
     

    二:多线程性能测试

    from multiprocessing import Process
    from threading import Thread
    import os,time
    
    def work():
        res=0
        for i in range(100000000):
            res*=i
    
    if __name__ == '__main__':
        l=[]
        print(os.cpu_count())
        start=time.time()
        for i in range(6):
            # p=Process(target=work)
            p=Thread(target=work)
            l.append(p)
            p.start()
        for p in l:
            p.join()
        stop=time.time()
        print('run time is %s' %(stop-start)) #4.271663427352905
    计算密集型:应该使用多进程
    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(300):
            # p=Process(target=work) #2.225289821624756
            p = Thread(target=work)  # 2.002105951309204
            l.append(p)
            p.start()
        for p in l:
            p.join()
        stop = time.time()
        print('run time is %s' % (stop - start))
    IO密集型: 应该开启多线程

    三:GIL vs自定义互斥锁

    from threading import Thread,Lock
    import time
    
    mutex=Lock()
    n=100
    def task():
        global n
        with mutex:
            temp=n
            time.sleep(0.1)
            n=temp-1
    
    if __name__ == '__main__':
        l=[]
        for i in range(100):
            t=Thread(target=task)
            l.append(t)
            t.start()
    
        for t in l:
            t.join()
        print(n)

    四、关于线程的故事
    线程小故事

  • 相关阅读:
    【转】CUDA5/CentOS6.4
    【转】centos 6.4 samba 安装配置
    【转】Install MATLAB 2013a on CentOS 6.4 x64 with mode silent
    【转】Getting xrdp to work on CentOS 6.4
    【VLFeat】使用matlab版本计算HOG
    Unofficial Windows Binaries for Python Extension Packages
    March 06th, 2018 Week 10th Tuesday
    March 05th, 2018 Week 10th Monday
    March 04th, 2018 Week 10th Sunday
    March 03rd, 2018 Week 9th Saturday
  • 原文地址:https://www.cnblogs.com/zedong/p/9606541.html
Copyright © 2011-2022 走看看