python多线程锁(python有了GIL,为什么还有线程锁)

2025-03-23 16:50:02 0

python多线程锁(python有了GIL,为什么还有线程锁)

本文目录

python有了GIL,为什么还有线程锁

GIL是限制同一个进程中只有一个线程进入Python解释器。。。。。而线程锁是由于在线程进行数据操作时保证数据操作的安全性(同一个进程中线程之间可以共用信息,如果同时对数据进行操作,则会出现公共数据错误)其实线程锁完全可以替代GIL,但是Python的后续功能模块都是加在GIL基础上的,所以无法更改或去掉GIL,这就是Python语言最大的bug…只能用多进程或协程改善,或者直接用其他语言写这部分

python线程有几种锁

普通的一个多线程小例子。我一笔带过地讲一讲,我创建了一个继承Thread类的子类MyThread,作为我们的线程启动类。按照规定,重写Thread的run方法,我们的线程启动起来后会自动调用该方法。于是我首先创建了10个线程,并将其加入列表中。再使用一个for循环,开启每个线程。在使用一个for循环,调用join方法等待所有线程结束才退出主线程。

python GIL 和 线程锁是不是同一个东西

今天看到一篇文章,讲述的是几个提升python性能的项目:传送门

在看的过程中,接触到一个名词,一个从学python开始就一直看到,但是从来都是一知半解的名词,心里不开心,必须把它搞明白,对了,这个词就是 GIL。网上搜索了一些资料,粗浅的理解了什么是GIL,自己感觉学习的过程比较好,感觉略有收获,老规矩,为了巩固知识,自己整片文章出来写一写,其实好多文章已经写的很完善了,所以这篇随笔,只做知识巩固,如有雷同,请各位原创作者原谅,小菜鸟一枚,如果哪里写的有问题,还请各位前辈不吝指正。

一句话:解决多线程之间数据完整性和状态同步的最简单方法自然就是加锁。

首先,GIL的全名,Global Interpreter Lock,鉴于英文水平,不做名词翻译,以免误导。大体解释一下,这个锁就是用来为了解决Cpython多线程中线程不安全问题引入的一个全局排它锁,它的作用就是在多线程情况下,保护共享资源,为了不让多个线程同时操作共享资源,导致不可预期的结果而加上的锁,在一个线程操作共享资源时,其他线程请求该资源,只能等待GIL解锁。这个设置在Cpython刚引入多线程概念的时候就有了,然后后续的各种包和组件开发都不可避免的受到了GIL的影响,所以有人会说,python在多线程处理的时候很慢。python GIL实现方式类似于如下伪代码:

if __name__ == ’__main__’:GIL锁开始运作主线程做操作主线程完成操作GIL锁释放资源

所以多线程共同操作共享资源的时候,有一个线程竞得了资源,它就被GIL锁保护起来,其他线程只能是在那里等着,但是这个时候,线程的休眠唤醒,全部会消耗CPU资源,所以嘞,就会慢。

看到这个时候,我又发现了一个名词:线程安全。这个名词,也是那种特别熟悉,但就是无法清晰的说出它是啥的概念。查了资料,在这记一下:

线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。

我自己想了一下,大约就是这样,比如整个列表,俩个线程同时在列表中append操作,如果没有锁的保护,在机缘巧合之下,俩个线程同时先后申请了空间且没来得及插入数据,然后这时列表中只会有一个空间,那么在插入过程中只能有一个数据写入,会造成不可知后果,有可能报错终止,有可能有一个线程操作没成功,那么这个就是线程不安全了,大白话说,只要线程之间没有共享资源,那么就是线程安全的,有共享资源,为了保证线程安全,需要引进锁的机制。

而后的文章中,有前辈做过实验:

顺序执行的单线程(single_thread.py)#! /usr/bin/pythonfrom threading import Threadimport timedef my_counter():i = 0    for _ in range(100000000):i = i + 1    return Truedef 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/pythonfrom threading import Threadimport timedef my_counter():i = 0    for _ in range(100000000):i = i + 1    return Truedef main():thread_array = {}start_time = time.time()    for tid in range(2):t = Thread(target=my_counter)t.start()thread_array.join()end_time = time.time()    print(“Total time: {}“.format(end_time - start_time))if __name__ == ’__main__’:main()

最终结果如下:

过程证明了因为GIL的存在,导致python在使用多线程的时候反而不如顺序执行快。

此处我又温习了一下python线程:

线程的顺序执行还是多线程并发,取决于join函数的位置。join函数的作用是等待当前线程结束,所以每一个线程创建之后,调用start函数,这是在后面跟上该线程的join函数,那么就是顺序执行,如果多个线程先完成创建和start,最后加上join函数,那么就变成了多线程并发。

这就是今天的学习内容,其实所有知识网上都能找到,更想分享的是一种学习的方法,一种本身很不推荐的学习方法,那就是类似于探索性测试的学习,啥不懂就去看啥,有些时候,我们学习东西确实不能非要究其内在,软件行业的学习本身在非本行人事看来就特别神奇且枯燥,所以最初的学习,我们需要整个图形界面,让我们学到的东西有了成就感,如果上来先去研究机器码,那么没几个人愿意学下去,但是不管怎样,既然走上了软件行业的道路,这种探索性,打破砂锅问到底的学习,在我的感觉里应该是必经之路,也就是所谓的底层研究。以安卓开发举例,如果做安卓开发的,虽然能写出很漂亮的界面,解决所有的bug,如果不了解安卓系统linux层的知识,在我的眼里,从未把这种研发看做大牛。当然我并不觉得不了解linux底层的安卓研发可以解决任何bug

当下的软件行业进入了一个神奇的阶段,我已经听过无数遍的理论,培训机构出来就能赚钱,大学读着没用,在这里不讨论教育体制问题,从个人情感上,我觉得大学教育虽然没有教给学生直接找工作的技能,但是给了所有学生一个能够了解基础知识的园地,换而言之,作为行业的一员,总应该有将行业发展起来的觉悟,行业内整体风气,缺乏静下心来的沉淀。在大谈敏捷,行为驱动,机器学习的同时,自己需要静下心来回头看看,基础已然不牢,再走下去是否有些危险。是不是学习软件技术,就是为了获取互联网行业那虚高的工资,是否已经局限于第三方框架,一旦框架出现问题,只能打给客服而束手无策,是否有过没有做任何尝试就将bug归咎于安卓系统,阿里中间件等等,是不是旧技术还没用明白,为了新技术就可以不再去研究。

还是小菜鸟,在此大谈行业发展难免有些放肆,如有不对的地方,还请各位前辈不吝指正

Python中的各种锁

大致罗列一下:一、全局解释器锁(GIL)1、什么是全局解释器锁每个CPU在同一时间只能执行一个线程,那么其他的线程就必须等待该线程的全局解释器,使用权消失后才能使用全局解释器,即使多个线程直接不会相互影响在同一个进程下也只有一个线程使用cpu,这样的机制称为全局解释器锁(GIL)。GIL的设计简化了CPython的实现,使的对象模型包括关键的内建类型,如:字典等,都是隐含的,可以并发访问的,锁住全局解释器使得比较容易的实现对多线程的支持,但也损失了多处理器主机的并行计算能力。2、全局解释器锁的好处1)、避免了大量的加锁解锁的好处2)、使数据更加安全,解决多线程间的数据完整性和状态同步3、全局解释器的缺点多核处理器退化成单核处理器,只能并发不能并行。4、GIL的作用:多线程情况下必须存在资源的竞争,GIL是为了保证在解释器级别的线程唯一使用共享资源(cpu)。二、同步锁1、什么是同步锁?同一时刻的一个进程下的一个线程只能使用一个cpu,要确保这个线程下的程序在一段时间内被cpu执,那么就要用到同步锁。2、为什么用同步锁?因为有可能当一个线程在使用cpu时,该线程下的程序可能会遇到io操作,那么cpu就会切到别的线程上去,这样就有可能会影响到该程序结果的完整性。3、怎么使用同步锁?只需要在对公共数据的操作前后加上上锁和释放锁的操作即可。4、同步锁的所用:为了保证解释器级别下的自己编写的程序唯一使用共享资源产生了同步锁。三、死锁1、什么是死锁?指两个或两个以上的线程或进程在执行程序的过程中,因争夺资源或者程序推进顺序不当而相互等待的一个现象。2、死锁产生的必要条件?互斥条件、请求和保持条件、不剥夺条件、环路等待条件3、处理死锁的基本方法?预防死锁、避免死锁(银行家算法)、检测死锁(资源分配)、解除死锁:剥夺资源、撤销进程四、递归锁在Python中为了支持同一个线程中多次请求同一资源,Python提供了可重入锁。这个RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。递归锁分为可递归锁与非递归锁。五、乐观锁假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。六、悲观锁假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。python常用的加锁方式:互斥锁、可重入锁、迭代死锁、互相调用死锁、自旋锁。

python 怎么实现多线程的

线程也就是轻量级的进程,多线程允许一次执行多个线程,Python是多线程语言,它有一个多线程包,GIL也就是全局解释器锁,以确保一次执行单个线程,一个线程保存GIL并在将其传递给下一个线程之前执行一些操作,也就产生了并行执行的错觉。

python多线程锁(python有了GIL,为什么还有线程锁)

本文编辑:admin

更多文章:


shutdown定时关机(怎样定时关机)

shutdown定时关机(怎样定时关机)

本文目录怎样定时关机怎么能设置电脑定时关机电脑可以定时关机吗怎样定时关机1、右键单击“开始”,弹出菜单选择“控制面板”,如图:2、然后点击控制面板里的“管理工具”,如图:3、在管理工具里点击“计划任务程序”,如图:4、先点击下任务计划程序库

2025年4月4日 02:40

单点登录系统实现(外部系统单点登录的实现)

单点登录系统实现(外部系统单点登录的实现)

本文目录外部系统单点登录的实现单点登录是什么如何实现外部系统单点登录的实现一般来说,有三种层次的实现机制,不能详细描述,只能探讨一下大概方向:由sso系统为第三方系统提供授权接口,修改第三方系统的权限体系,采用sso的统一接口进行权限管理、

2025年3月24日 03:40

打开网页出现乱码(win7网页打开出现乱码怎么解决)

打开网页出现乱码(win7网页打开出现乱码怎么解决)

本文目录win7网页打开出现乱码怎么解决为什么打开网页,显示的是乱码呢电脑打开网页出现乱码网页打开部分乱码如何解决为什么网页打开时是乱码浏览器出现乱码怎么解决打开网页,所有文字都变成了乱码怎么办急急急!!!win7网页打开出现乱码怎么解决方

2025年2月22日 10:40

现在用svn的多还是git的多(git和svn哪个好)

现在用svn的多还是git的多(git和svn哪个好)

本文目录git和svn哪个好Git和SVN的区别,哪个好企业使用svn和git哪个多一些Git和SVN,代码管理哪个更好git和svn哪个好GIT是分布式的,SVN不是:这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的

2025年3月27日 05:00

jquery下载表格(jquery表格插件哪个)

jquery下载表格(jquery表格插件哪个)

本文目录jquery表格插件哪个请教如何用JQuery导入导出excel表格我在jquery mobile里怎么实现表格jQuery实现的可编辑表格完整实例jquery表格插件哪个大多数前端er都把网页中的table标签替换为div,主要就

2025年2月22日 15:00

aspectj依赖(一个简单的SpringMVC需要哪些jar包)

aspectj依赖(一个简单的SpringMVC需要哪些jar包)

本文目录一个简单的SpringMVC需要哪些jar包spring-aspects和aspectjweaver.jar,aspectjrt.jar这两个包的关系一个简单的SpringMVC需要哪些jar包spring依赖的jar包如下:下面是

2025年3月15日 10:20

嵌入式编程语言有哪些(嵌入式系统开发都用到什么语言啊)

嵌入式编程语言有哪些(嵌入式系统开发都用到什么语言啊)

本文目录嵌入式系统开发都用到什么语言啊嵌入式系统需要学什么语言嵌入式开发语言有哪些嵌入式开发要学什么嵌入式开发要学哪些东西嵌入式用什么语言编程嵌入式软件编程语言有哪些嵌入式系统开发都用到什么语言啊目前,在嵌入式系统开发过程中使用的语言种类很

2025年3月20日 20:30

gridview删除一行(如何删除gridview的所有行)

gridview删除一行(如何删除gridview的所有行)

本文目录如何删除gridview的所有行gridview 怎样删除一行删除data gridview中一行数据并刷新asp.net c#如何删除gridview选中一行数据GridView如何删除一行C#如何删除Gridview中一行数据g

2025年2月10日 12:10

任何的任意的英文(任意的的英语翻译 任意的用英语怎么说)

任何的任意的英文(任意的的英语翻译 任意的用英语怎么说)

本文目录任意的的英语翻译 任意的用英语怎么说“随意”英文怎么说三者或三者以上的“任何一个”的英语是什么任何用英文怎么说任何的英语单词怎样写“任何人”的英文是什么“随便”的英文怎么说任意的的英语翻译 任意的用英语怎么说任意的 每一个属性

2025年2月16日 00:50

内存管理有哪几种方式(为什么现在手机 256G 越来越不够用了有哪些内存管理的技巧)

内存管理有哪几种方式(为什么现在手机 256G 越来越不够用了有哪些内存管理的技巧)

本文目录为什么现在手机 256G 越来越不够用了有哪些内存管理的技巧Linux进程内存管理方法Windows内存管理的几种方式和优缺点进程内存管理方法常用的内存管理方法有哪些阐述操作系统是如何对cpu,内存和磁盘进行管理的操作系统内存管理的

2025年3月3日 00:50

web设计软件(web前端软件学习)

web设计软件(web前端软件学习)

本文目录web前端软件学习web软件的界面尺寸有什么可视化设计web界面的工具web程序设计用什么软件做题求推荐Web App原型设计、代码生成软件web app开发需要什么软件常见web程序设计的开发工具有哪些,各自的特点是什么web前端

2025年3月1日 12:50

网站编程软件(做网站和开发软件的公司为什么感觉越来越难做)

网站编程软件(做网站和开发软件的公司为什么感觉越来越难做)

本文目录做网站和开发软件的公司为什么感觉越来越难做网络工程(软件开发)与软件工程有什么区别学习内容一样吗做网站和开发软件的公司为什么感觉越来越难做其实不仅是做网站和软件开发的公司越来越难做,做系统集成的公司其实更难做。本人虽是计算机专业出身

2025年2月19日 12:20

persistence形容词(形容词,副词和介词的用法(要百分百正确的))

persistence形容词(形容词,副词和介词的用法(要百分百正确的))

本文目录形容词,副词和介词的用法(要百分百正确的)free和freedom有什么区别英语中形容词的比较级的变化规律10个词语的解释形容词,副词和介词的用法(要百分百正确的)形容词解释一。只能用作定语,不能用作表语的形容词:little,wo

2025年2月19日 19:40

js跳转页面(js脚本中如何实现页面间的跳转)

js跳转页面(js脚本中如何实现页面间的跳转)

本文目录js脚本中如何实现页面间的跳转js网页跳转问题js的几种跳转有什么区别js如何跳转页面js 怎么跳转到另外的一个页面js判断是否登录并跳转页面JS实现页面跳转的几种方式js点击按钮跳转页面有哪些方法js脚本中如何实现页面间的跳转1、

2025年2月19日 20:30

ctrl键用法大全(怎样用ctrl键)

ctrl键用法大全(怎样用ctrl键)

本文目录怎样用ctrl键Ctrl键是什么意思快捷键ctrl放大ctrl键是什么意思ctrl+n、ctrl+c、ctrl+v、ctrl+w这些快捷键都是干什么用的Ctrl加各键的用法电脑键盘ctrl键的功能ctrl用法:怎样用ctrl键ctr

2025年3月10日 20:50

automaticupdates(无法启动Automatic Updates)

automaticupdates(无法启动Automatic Updates)

本文目录无法启动Automatic UpdatesAutomatic Updates服务怎么禁用.无法启动Automatic Updates服务automatic updates 启动失败 提示“本地计算机无法启动autom

2025年3月23日 17:30

www.code123.net这个网址做的不错,源码哪里可以下啊?洛阳一拖是五年一贯制大专吗 能发毕业证吗

www.code123.net这个网址做的不错,源码哪里可以下啊?洛阳一拖是五年一贯制大专吗 能发毕业证吗

本文目录www.code123.net这个网址做的不错,源码哪里可以下啊洛阳一拖是五年一贯制大专吗 能发毕业证吗郑州轨道工程职业学院就业怎么样www.code123.net这个网址做的不错,源码哪里可以下啊这是首页的源代码:《!DOCTYP

2025年3月4日 17:50

验收测试包括哪些(软件验收测试应该完成哪些主要测试工作)

验收测试包括哪些(软件验收测试应该完成哪些主要测试工作)

本文目录软件验收测试应该完成哪些主要测试工作验收测试的介绍验收测试主要有哪些人参与测试验收测试报告谁编写软件验收测试应该完成哪些主要测试工作验收测试用来验证系统是否达到了用户需求规格说明书(可能包括项目或产品验收准则)中的要求,测试希望尽可

2025年3月14日 14:00

周易网站源码(《周易》既熟悉又陌生,这部神秘的天书暗藏了哪些智慧呢)

周易网站源码(《周易》既熟悉又陌生,这部神秘的天书暗藏了哪些智慧呢)

本文目录《周易》既熟悉又陌生,这部神秘的天书暗藏了哪些智慧呢有没有自学周易的好网站介绍怎样能审办易经预测网站平台什么是周易中华周易最准确的网站《周易》既熟悉又陌生,这部神秘的天书暗藏了哪些智慧呢儒学影响了我国两千多年,虽然中国有一些道家、法

2025年3月20日 14:20

importance可数吗(importance能加s吗)

importance可数吗(importance能加s吗)

本文目录importance能加s吗importance可数吗importance能加s吗不能,importance是不可数名词。名词 n. 1.重要,重大;重要性Here I would stress the importance of

2025年3月16日 08:00

近期文章

lender(你怎么看比特币)
2025-04-05 12:50:02
upload(upload的意思)
2025-04-05 11:40:02
本站热文

harbor,port,pier的区别?谁能解释“harbour“(港口)与“pier“(码头)的区别
2025-02-22 17:40:03 浏览:18
ibatis foreach(ibatis 批量update操作)
2025-02-10 23:40:06 浏览:7
endless rain(endless rain表达什么情感)
2025-02-14 06:00:02 浏览:6
标签列表

热门搜索