搜索内容

您当前的位置:首页 > 办公技巧 > 正文

python 互斥锁_互斥锁实现

办公技巧
日期·2024-10-10 09:15

python 什么是全局解释器锁GIL

据创客学院经验告诉你物联网包含感知层、网络层、应用层三个方面。

每个CPU在同一时间只能执行一个线程,那么其他的线程就必须等待该线程的全局解释器,使用权消失后才能使用全局解释器,即使多个线程直接不会相互影响在同一个进程下也只有一个线程使用CPU,这样的机制称为全局解释器锁(GIL)。GIL的设计简化了CPython的实现,使得对象模型包括关键的内建类型,如:字典等,都是隐含的,可以并发访问的,锁住全局解释器使得比较容易地实现对多线程的支持,但也损失了多处理器主机的并行计算能力。

python 互斥锁_互斥锁实现python 互斥锁_互斥锁实现


python 互斥锁_互斥锁实现


全局解释器锁的好处

Python全局解释器锁(GIL)是一种互斥锁或锁,仅允许一个线程持有Python解释器的控制权。

1、避免了大量的加锁解锁的好处;

什么是Python全局解释器锁(GIL)2、使数据更加安全,解决多线程间的数据完整性和状态同步。

全局解释器锁的劣势

多核处理器退化成单核处理器,只能并发不能并行。

Python全局解释器锁(GIL)的作用

多线程情况下必须存在资源的竞争,GIL是为了保证在解释器级别的线程使用共享资源(cpu)。

物联网如何学习?

2、硬件相关

物联网基础到底学什么呢?一起来看看!

1、编由于物理上得限制,各CPU厂商在核心频率上的比赛已经被多核所取代。为了更有效的利用多核处理器的性能,就出现了多线程的编程方式,而随之带来的就是线程间数据一致性和状态同步的困难。即使在CPU内部的Cache也不例外,为了有效解决多份缓存之间的数据同步时各厂商花费了不少心思,也不可避免的带来了一定的性能损失。程语言

C语言程序设计、Python语言程序设计、Ja语言程序设计等等等,这些是非常基础的一些课程。目前C语言在嵌入式开发领域的应如果是上物联网专业,有一定的专门课程。如果是自学,可以从以上三个方面着手。用比较普遍,除了C语言之外,还可以使用Python从事嵌入式开发,但是C还是占用了主要的作用。

大学物理、电路基础、计算机组成原理、信号与系统、模拟电路技术基础、数字电路技术基础。

3、系统集成

4、应用相关

物联网移动应用开发、云计算部署与运维、应用设计与系统集成、WEB前端开发等等。

感知层、网络层、应用层三个方面 如果是上物联网专业,有一定的专门课程。 如果是自学,可以从以上三个方面着手。

从感知层、应用层方面入手可能好一些,网络层有很多方面属于运作。

python 什么是全局解释器锁gil

传感器原理及应用、单片机原理与技术、Linux作系统及应用、嵌入式系统与设计、物联网GIL的影响作系统等等。

首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把GIL归结为Python语言的缺陷。所以这里要先明确一点:GIL并不是Python的特性,Python完全可以不依赖于GIL

物联网集成了多方面的知识,包括控制、硬件、软件,基本内容就是RFID传感器,想学的话先找本书大致了解下物联网的情况吧

那么CPython实现中的GIL又是什么呢?GIL全称Global Interpreter Lock为了避免误导,我们还是来看一下给出的解释:

In CPython, the global interpreter lock, or GIL, is a mutex that prnts multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory mament is not thread-safe. (Howr, since the GIL exists, other features he grown to depend on the guarantees that it enforces.)

好吧,是不是看上去很糟糕?一个防止多线程并发执行机器码的一个Mutex,乍一看就是个BUG般存在的全局锁嘛!别急,我们下面慢慢的分析。

为什么会有GIL

Python当然也逃不开,为了利用多核,Python开始支持多线程。而解决多线程之间数据完整性和状态同步的最简单方法自然就是加锁。 于是有了GIL这把超级大锁,而当越来越多的代码库开发者接受了这种设定后,他们开始大量依赖这种特性(即默认python内部对象是thread-safe的,无需在实现时考虑额外的内存锁和同步作)。

慢慢的这种实现方式被发现是蛋疼且低效的。但当大家试图去拆分和去除GIL的时候,发现大量库代码开发者已经重度依赖GIL而非常难以去除了。有多难?做个类比,像MySQL这样的“小项目”为了把Buffer Pool Mutex这把大锁拆分成各个小锁也花了从5.5到5.6再到5.7多个大版为期近5年的时间,并且仍在继续。MySQL这个背后有公司支持且有固定开发团队的产品走的如此艰难,那又更何况Python这样核心开发和代码贡献者高度社区化的团队呢?

所以简单的说GIL的存在更多的是历史原因。如果推到重来,多线程的问题依然还是要面对,但是至少会比目前GIL这种方式会更优雅。

从上文的介绍和的定义来看,GIL无疑就是一把全局排他锁。毫无疑问全局锁的存在会对多线程的效率有不小影响。甚至就几乎等于Python是个单线程的程序。 那么读者就会说了,全局锁只要释放的勤快效率也不会啊。只要在进行耗时的IO作的时候,能释放GIL,这样也还是可以提升运行效率的嘛。或者说再也不会比单线程的效率吧。理论上是这样,而实际上呢?Python比你想的更糟。

下面我们就对比下Python在多线程和单线程下得效率对比。测试方法很简单,一个循环1亿次的计数器函数。一个通过单线程执行两次,一个多线程执行。比较执行总时间。测试环境为双核的Mac pro。注:为了减少线程库本身性能损耗对测试结果带来的影响,这里单线程的代码同样使用了线程。只是顺序的执行两次,模拟单线程。

版权声明:图片、内容均来源于互联网 如有侵权联系k19126499204@163.com 删除