浅谈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机制。
版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则
按侵权处理.
文章写的挺不错的,留言支持下,欢迎回访我的网站,你网站挺不错的能否交换友链:苏红文创, http://www.suhongv.com