GIL:全局解释器锁(cpython中)
GIL产生的背景,由于C语言底层原因,CPpython中多线程运行,每个线程都需要申请全局资源,但是Cpython并不能应对所有线程同时的资源请求,为防止发生错误,对所有线程申请全局资源的时候增加了限制--全局解释器锁。(造成线程只能一个一个的运行)
GIL释放:当前线程执行超时(Python计时器)会自动释放,如果当前线程没有超时但执行结束也会释放,当前线程执行阻塞操作时也会自动释放(如IO操作,等待操作,下载操作)
GIL只是CPython中的全局解释器锁,如果使用其他Python解释器则没有GIL这个名词。
CPython中创建的每个线程在执行的过程中都要需要先获取GIL,保证同一个时刻只有一个线程可以执行代码
python使用多进程是可以利用多核的CPU资源的
 
 
既然CPython中有GIL,还有必要在CPython使用多线程吗?
 由于GIL锁在线程遇到阻塞操作时会释放,进而执行另一个线程,所以如果使用多线程执行IO密集型操作是有性能提升的,但是如果使用多线程执行计算密集型操作是没有性能提升的。
 
 
既然CPython中有GIL,还有必要在CPython中使用线程锁(Lock互斥锁)吗?
 因为GIL的释放时机我们无法控制,很可能操作并没有完成,而Lock是我们用完后手动释放(操作完整)。
线程1 取出全局变量 g_number == 0 一直加到20000,但是还没有来得及将20000写入g_number中,就超时了自动释放GIL 而线程2 取出g_number==19999 加到39999由于超时自动释放GIL 此时线程2获取到GIL继续着未完成的事业将20000写入g_number。结果就会是错误的,如果进行互斥锁,会完成成功计算。
 

最新文章

  1. [Solution] AOP原理解析及Castle、Autofac、Unity框架使用
  2. 多准则决策模型-TOPSIS方法
  3. maven总结4
  4. Struts2的简单案例
  5. Beginning Android 4 Programming Book学习
  6. QQ协议的TEA加解密算法
  7. 【AngularJS】——0.分析
  8. android导入项目出错处理
  9. Sql Server 面试题
  10. BC 2015在百度之星程序设计大赛 - 预赛(1)(KPI-树董事长)
  11. MySQL python组件安装
  12. .NET跨平台实践:再谈用C#开发Linux守护进程
  13. Spring aop 注解参数说明
  14. java----静态代理
  15. Linux新手随手笔记1.3
  16. vue路由1:基本使用
  17. BBU和RRU具体区别是 什么?
  18. 集群中节点(Node)与单机数据库的区别
  19. 第十一章 串 (c2)KMP算法:查询表
  20. linq partition by

热门文章

  1. 四十五、SAP中Message的管理
  2. 101-PHP二维数组的元素输出三,封装成函数
  3. 059-PHP中多重for循环
  4. 计算方法执行完的耗时 c#
  5. opencv.js双边滤波 磨皮处理
  6. (22)Canny算法
  7. T_SQL 获取系统当前时间与明天时间的两种格式
  8. 【Python】【Django】查询所有学生信息
  9. linux常用命令-关机、重启
  10. 【剑指Offer】面试题24. 反转链表