这篇文章小编主要给大家带来python中GIL是什么的相关介绍,如果有感兴趣的小伙伴可以耐心阅读一下这篇文章,详细通过阅读这篇文章大家能够收获不少东西。
我们废话少说直接开门见山:GIL是什么?
GIL是Global Interpreter Lock的缩写,首先我们需要明确的一点是它并不是python的特性,它是python解释器中通过Cpython来引入的一个概念。而且python的解释器不仅仅只有C python,如果解释器为J python,那么在python中就没有GIL了,可以理解为Cpython中包含了GIL。GIL并不是Python的特性,Python完全可以不依赖于GIL。
官方的解释是:GIL是用来防止多线程并发执行机器码的一个Mutex(互斥锁),原因是:Cpython的内存管理是 not thread-safe。
GIL的影响
那我们通过官方的定义来看,GIL无疑就是一把全局拍他锁,那么我们可以肯定的是全局锁的存在能够对多线程的效率有着不少的影响,甚至可以说等于python是个单线程的程序了。
那么小编就通过下面的例子来给大家对比下python在多线程和单线程下的效率对比,测试方法很简单,我们通过一个循环一亿次的计数器函数。第一个用单线程来执行两次,第二个多线程执行。最后我们来对比一下总的执行时间。
顺序执行的单线程(single_thread.py)
#! /usr/bin/python from threading import Thread import time def my_counter(): i = 0 for _ in range(100000000): i = i + 1 return True def main(): thread_array = {} start_time = time.time() for tid in range(2): t = Thread(target=my_counter) t.start() t.join() end_time = time.time() print("Total time: {}".format(end_time - start_time)) if __name__ == '__main__': main()
同时执行的两个并发线程(multi_thread.py)
#! /usr/bin/python from threading import Thread import time def my_counter(): i = 0 for _ in range(100000000): i = i + 1 return True def main(): thread_array = {} start_time = time.time() for tid in range(2): t = Thread(target=my_counter) t.start() thread_array[tid] = t for i in range(2): thread_array[i].join() end_time = time.time() print("Total time: {}".format(end_time - start_time))if __name__ == '__main__': main()
通过上例的案例,我们可以明显的发现,python在多线程的情况下比单线程的速度慢了近45%,按照之前的分析,即使有GIL全局锁的存在,串行化多线程应该和单线程有一样的效率才对。
那么怎么会有这么糟糕的结果呢?那么通过下篇文章小编通过GIL的实现原理再来给大家详细讲解一下。
以上就是小编给大家带来的在python的GIL是什么的相关知识了,希望大家通过阅读小编的文章之后能够有所收获!如果大家觉得小编的文章不错的话,可以多多分享给有需要的人。
更多python相关文章请访问分类:python
【版权声明】本文图文出自大盘站@dapan.cc,转载请注明出处!