浅谈Python的多线程的GIL

浅谈Python的多线程的GIL

在谈什么是GIL之前,我们来看看Python的线程例子

import threading

def worker():
    """thread worker function"""
    print 'Worker'
    return

threads = []
for i in range(5):
    t = threading.Thread(target=worker)
    threads.append(t)
    t.start()

上面的例子中,创建了5个线程,每个线程打印Worker之后就退出了。

但是实际上,这5个线程并不是并行执行的,所谓并行就是每个线程在同一时刻都获得cpu的时间片去执行自己的代码段(在多核的情况)
,这是为什么?这就是python的GIL的原因。

GIL是Global Interpreter Lock,GIL就像互斥锁,防止多个本地线程同时执行python的字节代码,那么问题来了,

为什么防止多个本地线程同时执行python的字节代码?
答案是python的内存管理不是线程安全的

上面的python打了星号,那是因为不是所有的python的解释器都是GIL的,
1. CPython是GIL的 – CPython是python默认的解释器
2. PyPy是GIL的
3. Jython和IronPython并不存在GIL

由于Jython和IronPython并不存在GIL,因此可以完全挖掘多核的系统的能力。

GIL是好还是不好呢?从性能的角度讲,肯定是不好的;但是CPython的内存安全的角度讲,是好的;

GIL的存在让多线程的程序没法并行执行,也就不能发挥多核的性能。

这样说,是不是说CPython的多线程是没有用的呢?
答案是:不是。
因为我们知道很多系统调用是很耗费时间的,我们可以把这些很耗费时间的系统放在单独的一个线程里面;还有就是一些IO操作也是很耗费时间,这部分也是可以放在单独的一个线程。

GIL是Global Interpreter Lock机制。

版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则
按侵权处理.

    分享到:

2 Replies to “浅谈Python的多线程的GIL”

留言

你的邮箱是保密的 必填的信息用*表示