zoukankan      html  css  js  c++  java
  • 全局解释器锁GIL

    我们使用高并发,一次是创建1万个线程去修改一个数并打印结果看现象:

    from threading import Thread
    import os
    
    
    def func(args):
        global n
        n = args
        print(n, os.getpid())
    
    
    n = 100
    t_list = []
    for i in range(10000):
        t = Thread(target=func, args=(i,))
        t.start()
        t_list.append(t)
    for t in t_list:
        t.join()
    print(n)

    我们可以看到,虽然是高并发,但是没有一条数据是重复的,为什么?因为Python解释器里面有全局解释器锁GIL,会让解释器每一时刻只有一个线程在运行,这样就保证了数据的安全了。

    从这里我们也看出了,因为有全局解释器锁的存在就导致代码的运行效率的变慢问题,导致多线程不能充分利用cpu,不管是4核8核16核,都只有一个线程在里面运行。但是这并不是python语言的问题,这是CPython解释器的特性问题,使用JPython解释器就没有全局锁,就不会导致执行效率的问题了。

    高CPU:高计算类——高CPU使用率

    高IO:

    • 输入,输出
    • 处理web请求(有网络延时)
    • 读数据库,写数据库
    • 处理日志文件,读日志文件
    • 处理QQ聊天,(recv,send)
    • 爬取网页

    我们大部分写的代码都是高IO的,真正用到高CPU的实际上很少。

    而且python的这个弊端并没有影响python的火爆程度,python的优势比如爬虫,处理we请求,他们都不受这个GIL的影响。

    所以在多线程中,遇到IO就切掉,让给其他线程去使用。

    如果真要用高CPU我们可是使用多进程来处理,比如有4,8,16个核的cpu。

  • 相关阅读:
    虚树入门
    378. 骑士放置(最大独立集)
    377. 泥泞的区域(最大点集)
    352. 闇の連鎖
    P2680 运输计划
    Linux下的段错误(Segmentation fault)
    Acwing 98-分形之城
    快速幂 和 快速乘
    P1308-道路修建 (noi 2011)
    洛谷 P1070 道路游戏(noip 2009 普及组 第四题)
  • 原文地址:https://www.cnblogs.com/aaronthon/p/9849248.html
Copyright © 2011-2022 走看看