问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-28 23:11

我来回答

1个回答

热心网友 时间:2022-04-18 06:33

今天看到一篇文章,讲述的是几个提升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[tid] = t    for i in range(2):
thread_array[i].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归咎于安卓系统,阿里中间件等等,是不是旧技术还没用明白,为了新技术就可以不再去研究。

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

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
电脑docx怎么转换成word文档电脑上docx格式文件转换方法 电脑白屏是怎么回事啊。??? 电脑开机花屏渐渐地白屏了显示器突然白屏花屏的原因及解决方法_百度知 ... iphone录屏失败因为5823什么意思_iphone录屏失败提示5823代表什么意思... 软考中级:信息安全工程师 求大神解答打印机如何设置默认双面打印 如何更改打印机的打印格式? 经期同房月经没了会怀孕吗 iphone8p轻触解锁设置 宝沃bx5300公里多少油钱 python 什么时候使用线程锁 python多线程编程:进程锁和线程锁 建议纹美瞳线吗?有什么不好的吗? 十八岁是哪年出生的 你们知道今年的18岁是哪年哪月哪日出生的吗? 一个女的今年18岁,她是0几年出生的? 今年18周岁是几几年出生的? 18岁是那一年出生的 手机酷狗上个人信息里有个唱,唱里面有个关注的人,请问用电脑怎么... 酷狗怎样设置禁止别人关注自己? 为什么酷狗上不能关注别人了呢? 酷狗怎么关注好友 怎么样在酷狗音乐关注别人的大号? 余额宝转账到别人支付宝手续费吗 余额宝转给对方支付宝收费吗 余额宝转别人的支付宝收费吗 余额宝转账到别人的支付宝要手续费吗 支付宝所有版本任何一个用户(支付宝余额的钱和余额宝的钱)互转要不要收费? 求一个华文新魏字体ttf格式的文件,有毒的滚! 字体下载了就解压了出来个TTF文件 三星手机a5怎么删除垃圾 三星A5,存储里面这个其他占用内存太多,怎么在最终不影响手机运行的情况下删除啊 手机qq空间里面突然没有qq家园了怎么办啊?怎么弄出来? Qq空间怎么没有家族认证了图标了 三星A5手机用什么清理垃圾软件好用 三星a5怎么卸载/删除软件 为什么我关注了tf家族qq空间 却找不到 qq空间怎么找不到 三星a5如何清理后台 找QQ空间家族。。。怎么办? 三星note5怎么清理手机里的垃圾文件 QQ空间家族那里有? 四川外国语学院多少分? 怎么弄到QQ家族? 三星s5手机内存不足怎么清理系统垃圾 怎么在QQ空间里面加入家族啊? iPhone6怎样设置视频横屏自动全屏呢? 三星a5怎么清理微信文件夹 QQ空间如何进家族? 还没到还款日,支付宝电话提醒,是被风控了吗?