Python 36 GIL全局解释器锁

Posted 温暖你的心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 36 GIL全局解释器锁相关的知识,希望对你有一定的参考价值。

一: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密集型: 应该开启多线程

 






以上是关于Python 36 GIL全局解释器锁的主要内容,如果未能解决你的问题,请参考以下文章

python全局解释器锁(GIL)

冻结的 Python 二进制文件会访问本地解释器和全局解释器锁(GIL)吗?

GIL全局解释器锁

python GIL锁

python高性能编程--002--全局解释器锁GIL

GIL(全局解释器锁)