python是一个解释型语言,但是可以使用多个解释器。比如C++,但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把GIL归结为Python语言的缺陷。所以这里要先明确一点:GIL并不是Python的特性,Python完全可以不依赖于GIL。

Cpython中包含一个GIL , 全局解释锁。设计之初是因为防止在解释器的主循环中,只有一个线程在运行。

但是计算机的能力提升,cpu多核的产生,python也开始支持多线程编程,但是线程的安全就是要加锁。于是有了GIL的超级大锁。但是GIL不是线程安全的。这就造成执行效率低的结果。

官方解释:

In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.)

翻译:

在CPython中,全局解释器锁(global interpreter lock, GIL)是一个互斥体,它防止多个本机线程同时执行Python字节码。这个锁是必要的,主要是因为CPython的内存管理不是线程安全的。(然而,自从GIL存在以来,其他特性已经逐渐依赖于它强制执行的保证。)

GIL无疑就是一把全局排他锁。毫无疑问全局锁的存在会对多线程的效率有不小影响。甚至就几乎等于Python是个单线程的程序。

怎么解决呢?

用multiprocess替代Thread

multiprocess库的出现很大程度上是为了弥补thread库因为GIL而低效的缺陷。它完整的复制了一套thread所提供的接口方便迁移。唯一的不同就是它使用了多进程而不是多线程。每个进程有自己的独立的GIL,因此也不会出现进程之间的GIL争抢。

参考:

https://www.cnblogs.com/SuKiWX/p/8804974.html

最新文章

  1. 用SSH访问内网主机的方法
  2. Jenkins部署到远程(Linux服务器)
  3. IOSGCD
  4. oracle TIMESTAMP日期相减
  5. leetcode:Roman to Integer(罗马数字转化为罗马数字)
  6. 黑盒测试用例设计方法&理论结合实际 -> 判定表驱动法
  7. MySQL server version for the right syntax to use near 'type=InnoDB' at line 1
  8. publish over ssh
  9. CSS3用法理解
  10. CodeChef Chef and Churu [分块]
  11. CMS垃圾收集器
  12. lua --- 表操作
  13. Go语言远程执行ssh命令简单封装(支持带交互命令)
  14. Nginx 负载均衡4种模式
  15. BZOJ3537 : [Usaco2014 Open]Code Breaking
  16. 七天学会ASP.NET MVC ——深入理解ASP.NET MVC
  17. 用node.js和webpack做前后端分离的总结
  18. 100-days:nine
  19. unittest之suite测试集(测试套件)
  20. oracle 删除表的几种方法及回收站

热门文章

  1. [CSP-S模拟测试]:chemistry(期望DP+组合数学)
  2. Autoresize UIView to fit subviews
  3. python中%代表什么意思?
  4. zabbix真的很简单 (安装篇)
  5. git 忽略提交及已push过得文件忽略提交
  6. Appium初始化设置:手写代码连接手机、appium-desktop连接手机
  7. JavaScript 获取function的参数
  8. git 更新代码
  9. spring cloud学习--eureka 02
  10. maven项目使用tomcat启动报错:Server Tomcat v8.5 Server at localhost failed to start