Cpython的全局解释器锁(GIL)

时间:2021-09-09 15:57:04
# Cpyrhon解释器下有个全局解释器锁-GIL:在同一
    # 在同一时刻,多线程中只有一个线程访问CPU
    # 有了全局解释器锁(GIL)后,在同一时刻只能有一个线程访问CPU。
    # 全局解释器锁锁的是线程,而不是数据。
    # 这种全局解释器锁的特性就是同一时间只有有一个线程访问CPU,所以在多个CPU的情况下,也只有一个线程在一个时间点访问CPU,这是Cpython解释器的特性,这是一个不好的特性
        # 到目前为止并没有一个解释器语言可以充分使用多个CPU,一个时间点只能一者访问CPU

# 在多线程环境中,python虚拟机按一下方式执行访问CPU:
    # 设置GIL
    # 切换到一个线程去执行
    # 运行指定数量的字节码指令或线程后主动让出控制(可以调用time.sleep())
    # 把线程设置为睡眠状态
    # 解决GIL
    # 再次重复以上所有操作

# 高CPU: 在高CPU利用率的代码中,此时这种同一时刻只能有一个线程访问CPU机制会响应效率,如高计算类的代码中。如真遇到这种情况,可以用多进程,不用多线程处理
# 高IO:处理文件、处理web请求、爬取网页、设备文件、读写数据、send、recv,我们遇到的基本都是IO的,很少遇到计算类的东西



# 比较多线程与多进程的效率。多线程的执行效率会好些,在高IO的情况、和简单的计算类情况下
import time
from threading import Thread
from multiprocessing import Process

def func(n):
    n + 1

if __name__ == '__main__':
    start = time.time()
    t_lst = []
    for i in range(100):
        t = Thread(target=func, args=(i, ))
        t_lst.append(t)
        t.start()

    for t in t_lst:
        t.join()
    t1 = time.time() - start

    start2 = time.time()
    p_lst = []
    for i in range(100):
        p = Process(target=func, args=(i, ))
        p_lst.append(p)
        p.start()

    for p in p_lst:
        p.join()
    t2 = time.time() - start2

    print(t1, t2)