全局解释器锁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。

原文地址:https://www.cnblogs.com/aaronthon/p/9849248.html