简介:许多朋友询问与Python相关的有多少个问题,以查看有多少个解锁GIL到达的问题。本文的首席CTO笔记将为您提供详细的答案,以供所有人参考。我希望这对每个人都会有所帮助!让我们一起看看!
需要清楚的第一件事是,吉尔不是python的特征。这是实现Python Parser(CPYTHON)时引入的概念。它就像C ++是一组语言(语法)标准,但可以使用不同的编译器将其编译到可执行的代码中。+,视觉C ++等。可以通过不同的python执行环境(例如cpython,pypy,psyco。都没有像jpython一样的吉尔顿执行的代码。cpython是Python,并且授予GIL归因于Python语言的缺陷。因此,这里有点清楚:Gil不是Python的特征,Python不能依赖Gil
那么Cpython实施中的GIL是什么?吉尔的全名全球口译员锁以避免误导,让我们看一下官方解释:
功能已经越来越依赖于其执行的保证。)
好吧,您看起来很糟糕吗?一种互助,可以防止多线程并发执行机代码。乍一看,这是一个像错误一样的全球锁!不用担心,让我们在下面缓慢分析。
为什么有吉尔
由于身体上的局限性,核心频率中各种CPU制造商的竞争已被多核。为了更有效地使用多核处理器的性能,出现了多线程编程方法,并且出现了难度数据一致性和线程之间的数据状态已同步。性能损失。
当然,Python无法逃脱。为了使用多核,Python开始支持多线程。解决数据完整性和状态同步的最简单方法自然是锁定的。开发人员接受此设置,他们开始依靠此特征(即,默认的Python内部对象是线程安全的,无需在实现时不考虑其他内存锁和同步操作)。
慢慢发现,这种实现方法被发现痛苦和效率低下。但是当每个人都试图拆分和删除GIL时,发现大量的图书馆代码开发人员已经依靠GIL并且很难删除。如何困难吗?像MySQL这样的“小型项目”进行类似的“小型项目”,在ordercontinue.mysql中花费了将近5年,从5.5到5.6至5.7超过5.7像Python的核心开发和代码贡献者这样的社区团队?
因此,仅仅是吉尔的存在就是更历史的原因。如果再次推动它,那么多线程的问题仍然需要面对,但至少它比当前的吉尔语更优雅。
吉尔的影响
从上面的引言和官方定义来看,吉尔无疑是一个全球锁。毫无疑问,全球锁的存在将对多线程的效率产生重大影响。它几乎等于Python是一个单个线程程序。然后读者会说,只要发布全球锁,勤奋效率就不会很糟糕。只要时间 - 耗费的IO操作,GIL就可以发布,这仍然可以提高操作效率。言语,它不会比单个线程效率差。理论上,情况是这种情况,但实际上?Python比您想象的要糟。
下面我们比较了Python在多线程和单个线程中的效率比较。测试方法非常简单,一行由1亿个计数器函数组成。一个通过单个线程进行两次执行,一个多线程执行。测试环境是双核Mac pro.note:为了减少线程库本身对测试结果的性能损失的影响,此处的单个线程的代码也使用线程。模拟一个线程。
吉尔仅限于仅一个线程进入python interner.sessenceSessessence的同一过程
线程锁定是由于该线程操作时数据操作的数据操作(可以在同一过程中的线程之间共享信息。如果数据同时运行,将发生公共数据错误)。)。
用其他语言编写此部分
吉尔是Python的全球口译员锁。如果在同一过程中有多个线程,则在运行Python programrun时,线程将占据Python解释器,在线程运行后可以运行其他线程。如果线程运行时间 - 在线程操作期间,则耗时 - 耗尽的操作,解释器锁和其他线程运行。因此,在多线程中,线程的操作仍然是顺序的,而不是同时。
在多过程中,每个过程都可以由系统分配,该系统等同于每个具有Python解释器的过程,因此多个过程可以实现多个过程并同时运行。缺点是流程系统资源开销很大。
全球口译员锁GIL(CPYTHON)
Python代码的执行由Python Virtual Machine(也称为解释器的主循环)控制。Cpython在执行多线程线程时不属线-Safe,因此对于程序的稳定性,请添加全局说明锁定以确保任何时候只有一个Python线程执行。尽管Python解释器可以“运行”多个线程,但同时只有一个线程在解释器中运行。
我们所说的Python的全球解释锁(GIL)只是互斥(或锁定)。这样的机制只允许一个线程控制Python Instraper.gil对执行单线程任务的程序员没有重大影响,但它已成为计算密集(CPU结合)和多线程任务的性能瓶颈。
相关建议:“ Python视频教程”
在多线程环境中,Python虚拟机执行如下:
A.设置吉尔;
B.切换到线程运行;
C.运行指定的字节码指令或线程以主动放弃控制(您可以致电Time.Sleep(0));
D.将线程入睡;
E.解锁吉尔;
F。再次重复所有步骤。
在调用外部代码(例如C/C ++扩展功能)时,GIL将被锁定直到此函数结束(因为没有Python的字节代码在此期间运行,因此它不会执行线程切换)编写扩展扩展程序编写程序。可以积极解锁吉尔。
Python多线程模块选择:
Python为多线程编程提供了几个模块,包括线程,线程和队列。线程和线程模块允许程序员创建和管理线程。线程模块提供了基本的线程和锁定支持,并且线程提供了更高的功能级别,更具功能性的线程管理功能。队列模块允许用户创建一个队列数据结构,该结构可用于在多个线程之间共享数据。
避免使用线程模块,因为较高的螺纹模块更为高级,因此对线程的支持更加完整,并且线程模块中的属性可能与螺纹冲突。第二,较少(实际上只有一个),并且有许多线程模块。此外,在主线程结束时,在线程模块的末尾,所有线程都将被迫结束。没有警告就不会发出警告。至少螺纹模块可以确保重要的子线程在退出之前退出该过程。
线程模块不支持监护线。当主线程退出时,所有子线程将被强行退出,无论它们是否仍在工作。Guardian线程通常是等待客户请求的服务器。如果没有客户的请求,它正在等待。如果将线程设置为监护线程,则意味着此线程并不重要。在此过程中,这并不重要。在此过程中,这并不重要。当退出时,您无需等待此线程退出。
结论:以上是首席CTO注释的相关内容答案,该答案汇编了相关内容,内容涉及如何查看有多少个解锁GIL的内容。希望它对您有所帮助!如果您解决了问题,请与更多关心此问题的朋友分享?