python-多线程gil 作者:马育民 • 2019-02-25 08:57 • 阅读:10132 # 概述 GIL的全称是:Global Interpreter Lock,意思就是 **全局解释器锁** 这个GIL并不是python的特性,他是只在CPython解释器里引入的一个概念,而在其他的语言编写的解释器里就没有这个GIL,例如:Jython,Pypy ### python多线程无法充分利用CPU 在下面的代码中,启动4个线程运行task()函数,观察任务管理器CPU利用率 ``` #coding=utf-8 import threading import time def task(): t=threading.current_thread() while True: # print(t.name) pass if __name__ == "__main__": for index in range(4): t=threading.Thread(target=task) t.start() ``` 观察发现,我的笔记本是双核4线程(相当于4个CPU),虽然是4个线程,但CPU最多利用率只到了25% [![](http://www.malaoshi.top/upload/0/0/1EF2rQNTyUus.png)](http://www.malaoshi.top/upload/0/0/1EF2rQNTyUus.png) >5个线程是因为有一个是主线程 如果用其他语言(如JAVA)实现多线程,启动1个线程CPU利用率达到25%,启动2个线程CPU利用率达到50%,启动4个线程CPU利用率达到100% **为什么python的多线程无法充分利用CPU??** 是因为有GIL ### GIL作用 而在Cpython解释器中,当我们的python代码有一个线程开始访问解释器的时候,GIL会把这个大锁给锁上,此时此刻其他的线程只能干等着,无法对解释器的资源进行访问,这一点就跟我们的互斥锁相似。而只是这个过程发生在我们的Cpython中,同时也需要等这个线程分配的时间到了,这个线程把gil释放掉,类似我们互斥锁的lock.release()一样,另外的线程才开始跑起来,说白了,**在python中即使是多线程开发,同一时刻也只有一个线程在运行**。 ### 为什么会有GIL? GIL的存在更多的是历史原因 现在CPU一般都支持多核,为了充分利用多核处理器,出现了多线程的编程方式,而随之带来的困难就是线程间 **数据完整性** 和 **状态同步** Python为了利用多核,也支持多线程。而解决多线程之间 **数据完整性** 和 **状态同步** 的最简单方法自然就是 **加锁**,于是设计了gil全局解释器锁。 ### CPython解释器为什么不移除GIL? 1. 曾经尝试移除过,导致单线程程序执行效率低下 2. 太多的模块都使用了python的GIL来编写,一旦去掉GIL ,这些模块都要重写,代价太大 ### 如何避免GIL 1. 用多进程,少用线程 2. 换解释器, CPython有GIL,可以换JPython 3. 用C语言扩展 ### 总结 GIL 全局解释器锁:线程的执行权限,在Python的进程里只有一个GIL。 一个 **线程** 需要 **执行** 任务,必须 **获取GIL**。 **好处:** 直接杜绝了多个线程访问内存空间的安全问题。 **坏处:** Python的多线程 **不是真正多线程**,不能充分利用多核CPU的资源。 但是,在 **I/O阻塞** 的时候,解释器会 **释放GIL**。 感谢: https://blog.csdn.net/feilzhang/article/details/80294572 https://www.cnblogs.com/huangguifeng/p/7632799.html 原文出处:http://malaoshi.top/show_1EF2rQQmiFOu.html