在看的过程中,接触到一个名词,一个从学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/python

from threading importThreadimporttimedefmy_counter():

i=0for _ in range(100000000):

i= i + 1

returnTruedefmain():

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/python

from threading importThreadimporttimedefmy_counter():

i=0for _ in range(100000000):

i= i + 1

returnTruedefmain():

thread_array={}

start_time=time.time()for tid in range(2):

t= Thread(target=my_counter)

t.start()

thread_array[tid]=tfor i in range(2):

thread_array[i].join()

end_time=time.time()print("Total time: {}".format(end_time -start_time))if __name__ == '__main__':

main()

最终结果如下:

以上测试代码和图片引用自:

http://cenalulu.github.io/python/gil-in-python/

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

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

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

python线程安全_线程,线程安全与python的GIL锁相关推荐

  1. Disruptor本地线程队列_实现线程间通信---线程间通信工作笔记001

    Disruptor本地线程队列_实现线程间通信---线程间通信工作笔记001 看到同事用这个东西了,这个挺好用的说是,可以实现,本地线程间的通信,好像在c++和java中都可以用 现在没时间研究啊,暂 ...

  2. python线程监控_一日一技:Python多线程的事件监控

    设想这样一个场景: 你创建了10个子线程,每个子线程分别爬一个网站,一开始所有子线程都是阻塞等待.一旦某个事件发生:例如有人在网页上点了一个按钮,或者某人在命令行输入了一个命令,10个爬虫同时开始工作 ...

  3. JAVA线程池_并发队列工作笔记0003---线程池的分类_可缓存线程池_定长线程池_定时线程池_单例线程池

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 这里说线程池的分类 有可缓存类型, 定长类型, 定时类型, 单例类型, 这里我这次用Executo ...

  4. JAVA线程池_并发队列工作笔记0002---认识线程池_在线程池中使用队列

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 上面是线程的执行周期 这个线程的生命周期,可以看到时间都浪费在了创建和销毁的这里了. 实际上执行业 ...

  5. jmc线程转储_查找线程转储中的异常和错误

    jmc线程转储 线程转储是解决生产问题/调试生产问题的重要工件. 在像过去我们已经讨论了几种有效的线程转储故障模式: 堵车 , 跑步机 , RSI , 一个 LL条条大路通罗马 .......... ...

  6. 动态调整线程池_调整线程池的重要性

    动态调整线程池 无论您是否知道,您的Java Web应用程序很可能都使用线程池来处理传入的请求. 这是许多人忽略的实现细节,但是迟早您需要了解如何使用该池以及如何为您的应用程序正确调整池. 本文旨在说 ...

  7. java 线程耗尽_关于线程耗尽导致请求超时系统假死

    线程耗尽:我们知道java程序中,所有计算都是通过线程来执行的,同时我们为了能够重复利用线程,避免频繁创建线程而消耗资源,一般我们都使用线程池,既然是池,那就表明线程是有限的,既然是有限的就会有耗尽的 ...

  8. java 线程耗尽_关于线程耗尽导致请求超时系统假死的思考

    线程耗尽:我们知道java程序中,所有计算都是通过线程来执行的,同时我们为了能够重复利用线程,避免频繁创建线程而消耗资源,一般我们都使用线程池,既然是池,那就表明线程是有限的,既然是有限的就会有耗尽的 ...

  9. [并发并行]_[线程模型]_[Pthread线程使用模型之一管道Pipeline]

    场景 1.经常在Windows, MacOSX 开发C多线程程序的时候, 经常需要和线程打交道, 如果开发人员的数量不多时, 同时掌握Win32和pthread线程 并不是容易的事情, 而且使用Win ...

  10. java传递父线程对象_父子线程和线程池如何实现threadLocal变量传递

    上一次我们看了ThreadLocal的原理和实现,今天我们看看下面几个问题: 1.多线程中父子线程,子线程如何获取父线程的变量?2.主线程和线程池的线程本地副本变量如何实现复用隔离? 一.Inheri ...

最新文章

  1. JAVA核心技术I---JAVA基础知识(查漏补缺private,static)
  2. 谷歌花35元就“骗”走刷脸数据:黑人为主,霸王条款无限使用,为强化新手机能力...
  3. 预处理命令 || 宏定义 || 带参数的宏定义
  4. 【多元域乘法】多项式乘法电路原理及MATLAB详解
  5. [html] 说说页面中字体渲染规则是怎样的?会有哪些因素影响字体的渲染?
  6. List 集合去重的 3 种方法
  7. 数独游戏技巧从入门到精通_工程施工图识图方法和技巧,使你从建筑施工入门到精通!...
  8. 面试总是死在网络协议,我该怎么办?
  9. Ceres配置(vs2013+Win10)
  10. python计算平面的法向-利用协方差矩阵求解特征值和特征向量
  11. JavaWeb公交调度系统的设计与实现
  12. 最新后盾网Smarty框架教程 Smarty重入门到实战教程 共14课
  13. 智齿科技携手无忧我房 VR+AI新品亮相GTC
  14. android恢复短信中心号码,短信中心号码设置解决安卓手机不能发短信问题,教你设置解决异地发不了短信问题...
  15. 上了学这么久,我才知道他们为什么可以这么爽
  16. matlab ax=b x=,matlab 求解 Ax=B 时所用算法
  17. php 抢红包_用PHP实现的抢红包小程序
  18. 基于Android的旅游景点推荐
  19. 【RL-TCPnet网络教程】第30章 RL-TCPnet之SNTP网络时间获取
  20. 用户登录程序C语言实现

热门文章

  1. 视图之一--创建简单的视图
  2. log4j2 配置详解及使用范例
  3. QQ各等级所需在线时长明细表
  4. Jmeter工作原理
  5. git remote 使用总结
  6. 第二十二章:面向对象(2)
  7. kafka入门(一)简介
  8. Python基础(8)素数输出
  9. 11.python之线程,协程,进程,
  10. 初学JAVA随记——代码练习(二元一次方程)