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。

  • 相关阅读:
    Codeforces Round #702 (Div. 3) 题解
    Educational Codeforces Round 104 (Rated for Div. 2) A~E题解
    AtCoder Regular Contest 112 A~D题解
    Codeforces Round #701 (Div. 2) A~E 题解
    java String, StringBuffer, StringBuilder简单介绍和使用
    货仓选址
    线程的同步
    数据结构课设作业
    线程的生命周期(java 图)
    JAVA多线程的创建和使用
  • 原文地址:https://www.cnblogs.com/aaronthon/p/9849248.html
Copyright © 2011-2022 走看看