本篇文章给大家分享的是有关python中的原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
python主要用来做什么
python主要应用于:1、web开发;2、数据科学研究;3、网络爬虫;4、嵌入式应用开发;5、游戏开发;6、桌面应用开发。
1、说明
gil规定一个python解释程序只能同时由一个线程控制。
在cpu限制类型和多线程代码中,gil是一个性能瓶颈。
gil使python多线程成为伪并行多线程。
仅cpython解释器上存在gil。
2、原理
(1)线程1、2、3轮流执行,每一个线程在执行是,都会锁住gil,以阻止别的线程执行;
同样的,每一个线程执行一段后,会释放gil,以允许别的线程开始利用资源。
(2)由于古老gil机制,如果线程2需要在cpu2上执行,它需要先等待在cpu1上执行的线程1释放gil(记住:gil是全局的)
(3)如果线程1是因为 i/o 阻塞让出的gil,那么线程2必定拿到gil。但如果线程1是因为timer ticks计数满100ticks(大概对应了1000个bytecodes)让出gil,那么这个时候线程1和线程2公平竞争。
(4)但要命的是,在python 2.x, 线程1不会动态的调整自身的优先级,所以很大概率下次被选中执行的还是线程1,在很多个这样的选举周期内,线程2只能安静的看着线程1拿着gil在cpu 1上欢快的执行。
(5)极端一点的情况下,比如线程1使用了while true在cpu1上执行,那就真是“一核有难,八核围观”了。
知识点扩展:
gil设计理念与限制
python的代码执行由python虚拟机(也叫解释器主循环,cpython版本)来控制,python在设计之初就考虑到在解释器的主循环中,同时只有一个线程在运行。即在任意时刻只有一个线程在解释器中运行。对python虚拟机访问的控制由全局解释锁gil控制,正是这个锁来控制同一时刻只有一个线程能够运行。
在调用外部代码(如c、c 扩展函数)的时候,gil将会被锁定,直到这个函数结束为止(由于期间没有python的字节码运行,所以不会做线程切换)。
在python中使用都是操作系统级别的线程,linux中使用的pthread,window使用的是其原生线程。
从上面的概述中可以直观的看出py在同一时刻只能跑一个线程,这样在跑多线程的情况下,只有当线程获取到全局解释器锁后才能运行,而全局解释器锁只有一个,因此即使在多核的情况下也只能发挥出单核的功能。
那么这样看起来py不给力啊,gil直接导致cpython不能利用物理多核的性能加速运行。那么为什么会有这样的设计?考虑到guido van rossum 在创造python的时候,上世纪90年代,多核cpu完全属于不可想象的,现在由于硬件发展速度太快,程序编写就要考虑用尽cpu的全部性能,否则就要被淘汰,那么对于python同样也要如此。
上面主要说的是这种设计的劣势,下面再讨论它的优势。
gil的设计简化了cpython的实现,使得对象模型,包括关键的内建类型如字典,都隐式可以并发访问。锁住全局解释器使得其比较容易的实现对多线程的支持,但也折损了多处理器主机的并行计算能力。
但是不论标准的,还是第三方的扩展模块,都被设计成在进行密集计算任务时释放gil。另外还有在做io操作时,gil总是被释放。对所有面对内建的操作系统c代码的程序来说,gil会在这个io调用之前被释放,以允许其它的线程在等待这个io的时候运行。如果是纯计算的程序,没有io操作,解释器会每隔100次或每隔一定时间15ms去释放gil。
这里可以理解为io密集型的python比计算密集型的程序更能利用多线程环境带来的便利。
以上就是python中gil的原理是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注本站行业资讯频道。