一、前言

我的机器有4核,代表着同一时间,可以干4个任务。如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让我看上去是并发的。但是单核永远肯定时串行的,它肯定是串行的,cpu真正执行的时候,因为一会执行1,一会执行2.。。。。正常的线程就是这个样子的。

但是,在python中,无论你有多少核,永远都是假象。无论你是4核,8核,还是16核.......不好意思,同一时间执行的线程只有一个(线程),它就是这个样子的。这个是python的一个开发时候,设计的一个缺陷,所以说python中的线程是假线程。

二、全局解释器锁(GIL)

2.1、英文解释

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.)

上面的核心意思就是:

无论你启多少个线程,你有多少个cpu, Python在执行的时候会淡定的在同一时刻只允许一个线程运行。

2.2、GIL存在的意义?

因为python的线程是调用操作系统的原生线程,这个原生线程就是C语言写的原生线程。因为python是用C写的,启动的时候就是调用的C语言的接口。因为启动的C语言的远程线程,那它要调这个线程去执行任务就必须知道上下文,所以python要去调C语言的接口的线程,必须要把这个上限问关系传给python,那就变成了一个我在加减的时候要让程序串行才能一次计算。就是先让线程1,再让线程2.......

每个线程在执行的过程中,python解释器是控制不了的,因为是调的C语言的接口,超出了python的控制范围,python的控制范围是只在python解释器这一层,所以python控制不了C接口,它只能等结果。所以它不能控制让哪个线程先执行,因为是一块调用的,只要一执行,就是等结果,这个时候4个线程独自执行,所以结果就不一定正确了。有了GIL,就可以在同一时间只有一个线程能够工作。虽然这4个线程都启动了,但是同一时间我只能让一个线程拿到这个数据。其他的几个都干等。python启动的4个线程确确实实落到了这4个cpu上,但是为了避免出错。这也是Cpython的一个缺陷,其他语言没有,仅仅只是Cpython有。

2.3、GIL锁关系图

GIL(全局解释器锁)是加在python解释器里面的,效果如图:

为什么GIL锁要加在python解释器这一层,而却不加在其他地方?

因为你python调用的所有线程都是原生线程。原生线程是通过C语言提供原生接口,相当于C语言的一个函数。你一调它,你就控制不了了它了,就必须等它给你返回结果。只要已通过python虚拟机,再往下就不受python控制了,就是C语言自己控制了。你加在python虚拟机以下,你是加不上去的。同一时间,只有一个线程穿过这个锁去真正执行。其他的线程,只能在python虚拟机这边等待。

三、总结

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

这篇文章透彻的剖析了GIL对python多线程的影响,强烈推荐看一下:

python gil锁为什么_day9-为什么会有GIL锁 (来自师兄总结的博客)相关推荐

  1. python脚本监控网站状态 - 赵海华_运维之路 - 51CTO技术博客

    python脚本监控网站状态 - 赵海华_运维之路 - 51CTO技术博客 python脚本监控网站状态 2013-01-09 09:21:02 标签:监控 python 原创作品,允许转载,转载时请 ...

  2. Python 爬虫入门(二)—— IP代理使用 - 不剃头的一休哥 - 博客园

    Python 爬虫入门(二)-- IP代理使用 - 不剃头的一休哥 - 博客园 Python 爬虫入门(二)-- IP代理使用 - 不剃头的一休哥 - 博客园 posted on 2016-01-26 ...

  3. python三大特征六大原则_设计模式-来玩魔王的咚!-51CTO博客

    每一个设计模式系统的命名.解释和评价了面向对象系统中一个重要的和重复出现的设计.这里面向对象划重点,意思是所有的设计模式都是针对面向对象的提出的. 设计模式的4个基本要素: 模式名称 问题 解决方案 ...

  4. python做meta分析_python的MetaClass的代码分析。基于廖雪峰博客代码

    1 #一张表一个类,表内每一行就是一个实例 2 ''' 3 一个单独的元类使用的程序分析.4 ''' 5 6 classField(object):7 def __init__(self, name, ...

  5. python 堆栈溢出_PWN简单堆栈溢出漏洞利用(一) | kTWO-个人博客

    摘要 本文将详细讲述PWN二进制漏洞中简单的堆栈利用,本文将从原理开始讲述,然后层层深入,让读者从理解到动手操作,能够跟着教程完成所有操作. 0x01 环境和程序准备 安装有pwntools的kali ...

  6. python反素数_可逆素数-随心随性无为而为-51CTO博客

    问题描述: 编写程序找出1~900之间的所有可逆素数(可逆素数是指一个素数的各位数值顺序颠倒后得到的数仍为素数,如113.311). 我的代码:import math def prime(n): co ...

  7. 爬虫python代码网易云_使用python爬取网易云歌曲下载时为0KB的解决方法 | ZPY博客...

    歌曲的下载地址为http://music.163.com/song/media/outer/url?id=xxx 用urllib.request.urlretrieve方法下载总是为0KB.但是奇怪的 ...

  8. python过去电脑网关_Python修改本地IP、网关和DNS | kTWO-个人博客

    # -*- coding: utf-8 -*- import os import random import re from time import sleep from wmi import WMI ...

  9. Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过浏览器审查元素解析真实网页地址...

    由于主流网站都使用JavaScript展示网页内容,和前面简单抓取静态网页不同的是,在使用JavaScript时,很多内容并不会出现在HTML源代码中,而是在HTML源码位置放上一段JavaScrip ...

最新文章

  1. android单个页面切换_MTransition是一个Android上的页面切换动画库
  2. JavaScript 设计模式的七大原则(未完成)
  3. android webview开启html5支持
  4. kaggle房价预测特征意思_Kaggle实战-波士顿房价预测
  5. javascript 学习教程
  6. 总结 | “卷积”其实没那么难以理解
  7. [LeetCode 题解]: Roman to Interger
  8. 计算机原理 ---- 程序之下
  9. qt drawrect绘制图形为什么不显示_Qt编写自定义控件45-柱状标尺控件
  10. gc日志怎么看_JVM探秘:GC日志收集与分析
  11. VB.NET2010 编程实现Word双面打印
  12. CCF中有关计算机网络的顶级会议和推荐期刊(2019年版本)
  13. 获取二维元组的每一维数据
  14. 2018年4月——英语
  15. C#如何使用skinEngine控件换肤(更换皮肤)?
  16. 阿里云原生实践:基于 Alluxio 数据缓存的大规模深度学习训练性能优化
  17. 基于Matlab模拟用于海况海洋学研究的 X 波段雷达系统(附源码)
  18. kuangbin带你飞博弈论I专题
  19. linux上sendmail配置文件,linux系统SendMail详细配置
  20. 最新pdf转换器注册码

热门文章

  1. EditText 里的属性
  2. 基于python的管理系统_基于ssm的管理系统_基于python管理系统
  3. WPS 中添加MathType插件
  4. 解决网络连接正常,网页打不开的问题
  5. 第3周课件-全网最详细的ORB-SLAM2精讲
  6. 数据结构与算法:实验报告(串及其应用)
  7. orthWind 数据库结构说明
  8. 用MATLAB求解拟合公式系数和拟合优度
  9. 博弈之威佐夫博弈详解
  10. ESP32设备驱动-ADXL345三轴加速计驱动