python的GIL锁
进程:系统运行的一个程序,是系统分配资源的基本单位。
线程:是进程中执行运算的最小单位,是处理机调度的基本单位。
处理机:是计算机中存储程序和数据,并按照程序规定的步骤执行指令的部件。包括中央处理器、主存储器、I/O接口。
程序:程序是描述处理机完成某任务的指令序列。
指令:处理机能够解释、直接执行的信息单位。
计算机系统:处理机+外围设备。
并行:多个cpu同时执行多个任务,假设有两个程序,这两个程序在两个不同的cpu上同时运行。
并发:单个cpu交替执行多个任务,假设有两个程序,这两个在该cpu上交替进行运行,而不是同时运行,只是由于执行的时间太快,让人误以为是在“同时进行”。执行的先后取决于对时间片资源的竞争。其中两种并发关系是同步和互斥。
同步:不是指同时进行,指线程之间按一定顺序进行运行,当前一个线程结束时,下一个线程才能够运行。
异步:线程不可以同时进行运行。
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。
(3)处理机分给线程,即真正在处理机上运行的是线程。
(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
如果把上课的过程比作进程,那么每个学生就是一个线程,他们共享教室,即线程共享进程的内存空间。每一个时刻,只能一个学生问老师问题,老师回答完毕,轮到下一个。即线程在一个时间片内占有cpu。

用C语言写的python解释器存在GIL,python语言本身是不存在GIL的 。GIL是cpython的全局解释器锁,而且只有一个。当同一进程中存在多个线程运行,一个线程在运行python程序的时候会占用Python解释器(即获得GIL),使该进程内的其他线程无法运行,等该线程运行完成后,其他线程才能运行。即使是在多核况下,也只能发挥单核的性能。
什么时候释放锁?
(1)对于i/o的线程,是不需要cpu的,也就是cpu空闲的时候。
(2)对于cpu密集型的线程,cpu会一直被占用进行计算,此时有一个指令计数器,当一个线程执行了一定数量的指令时(100),GIL就会被释放,释放后多个线程对GIL进行竞争。
解决GIL的方法?
(1)在使用多线程时,使用其他语言;
(2)换一种Python解释器;
(3)使用多进程;
GIL和互斥锁有什么区别?
互斥锁:修改数据时有序的更改,不产生数据的混乱。

一张图解决,注意:互斥不是线程之间按一定顺序执行,而是在同一时间只能执行一个线程。
python的GIL锁的更多相关文章
- 线程,线程安全与python的GIL锁
今天看到一篇文章,讲述的是几个提升python性能的项目:传送门 在看的过程中,接触到一个名词,一个从学python开始就一直看到,但是从来都是一知半解的名词,心里不开心,必须把它搞明白,对了,这个词 ...
- 【python】-- GIL锁、线程锁(互斥锁)、递归锁(RLock)
GIL锁 计算机有4核,代表着同一时间,可以干4个任务.如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让看上去是并发的.但是单核永远肯定时串行的,它肯定是串行的, ...
- Python进阶----GIL锁,验证Cpython效率(单核,多核(计算密集型,IO密集型)),线程池,进程池
day35 一丶GIL锁 什么是GIL锁: 存在Cpython解释器,全名:全局解释器锁.(解释器级别的锁) GIL是一把互斥锁,将并发运行变成串行. 在同一个进程下开启的多个线 ...
- 对于Python的GIL锁理解
GIL是什么 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念.就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可 ...
- python爬虫之多线程、多进程、GIL锁
背景: 我们知道多线程要比多进程效率更高,因为线程存在于进程之内,打开一个进程的话,首先需要开辟内存空间,占用内存空间比线程大.这样想也不怪,比如一个进程用10MB,开10个进程就得100MB的内存空 ...
- 关于python的GIL全局解释器锁的简单理解
GIL是解释器内部的一把锁,确切一点说是CPython解释器内部的一把锁,所以要注意区分 这和我们在Python代码中使用线程锁Lock并不是一个层面的概念. 1. GIL产生的背景: 在CPytho ...
- Python GIL锁
GIL全局解释器锁:为了解决多线程修改同一块数据. python的线程是调用操作系统的源生线程,启动时就是调用C语言的C源生接口,python调用C语言接口的线程去执行任务时,必须上下文对应关系传给C ...
- python全局解释器锁(GIL)
文章作者:卢钧轶(cenalulu) 本文原文地址:http://cenalulu.github.io/python/gil-in-python/ ,对文章做了适当的修改,加入了一些自己的理解. CP ...
- Python全局解释器锁 -- GIL
首先强调背景: 1.GIL是什么?GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定. 2.每个CPU在同一时间只能 ...
随机推荐
- Kafka系列二之部署与使用
Kafka部署与使用 写在前面 从上一篇Kafka的架构介绍和安装中,可能,你还一直很蒙,kafka到底该怎么使用呢?接下来,我们就来介绍Kafka的部署与使用.上篇文章中我们说到,Kafka的几个重 ...
- Linux上编译安装PHP
这篇文章主要介绍了关于Linux上编译安装PHP,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 之前在服务器上编译安装了PHP运行环境,但是安装完过了一段时间就差不多忘记了,只是零零星 ...
- Java 学习笔记之 线程Yield
线程Yield: yield()方法的作用是放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间,但放弃的时间不确定,有可能刚刚放弃,马上又获得CPU时间片. public class Yie ...
- Android_布局
<该文章参考各大博客以及书籍总结而来,如有问题欢迎指出^ ^> 一.五大传统布局+新布局 线性布局——LinearLayout 相对布局——RelativeLayout 帧布局——Fram ...
- python编程基础之三十
时间模块: 时间戳:就是当前是键距离1970年1月1日0:0:0的秒数,后面还带小数,可以说是非常精确 时间的表示形式: a.以整数或者浮点数表示一个以秒为单位的时间间隔,这个时间的基础值1970.1 ...
- Spring Boot (十五): 优雅的使用 API 文档工具 Swagger2
1. 引言 各位在开发的过程中肯定遇到过被接口文档折磨的经历,由于 RESTful 接口的轻量化以及低耦合性,我们在修改接口后文档更新不及时,导致接口的调用方(无论是前端还是后端)经常抱怨接口与文档不 ...
- cocos2d-x 系统学习cocos(2) 交互
交互 玩游戏的时候,我们需要用输入设备和游戏进行交互,那么游戏需要对玩家做出相应,比如说按下键盘的上下左右,角色就朝着对应的方向移动,按下技能键,角色就释放技能 键盘监听 响应 cocos2d-x中要 ...
- 原生无缝Banner轮播图
话不多说,先展示效果图.由于录制工具,稍显卡顿,实际是流畅的.可以看到实现了无缝轮播,鼠标悬停,点击左右上下按钮切换Banner的功能,如图1所示. 图1 原生无缝banner效果展示 以我这个轮播图 ...
- 浏览器标签tab窗口切换时事件状态侦听
做到 是大屏项目,用的websocket,在浏览器切换标签窗口后,过了一段时间回来,页面会非常卡,所以想页面切回来的时候刷新页面,找到了这个方法,这是原来的例子.这段代码可以自己复制去做下测试 var ...
- sql优化提速整理
sql优化提速整理 场景描述 在我们实际开发中,随着业务的不断增加,数据量也在不断的攀升,这样就离不开一个问题:数据查询效率优化 根据自己的以往实际项目工作经验和学习所知,现在对SQL查询优化做一个简 ...