当前位置: 首页 > 网络应用技术

python发行了多少毫秒

时间:2023-03-06 15:36:14 网络应用技术

  简介:许多朋友询问有关Python有多少毫秒的GIL相关问题。本文的首席CTO笔记开始为您的参考做出详细的答案。我希望这对每个人都会有所帮助!让我们一起看看!

  Python的原始解释器Cpython中有一个GIL(全球解释器锁,全球口译员锁)。因此,在解释Python代码时,相互排斥的锁将仅限于共享资源上共享资源的访问。/O操作或操作数量只有在达到一定数字时才会发布GIL。

  因此,尽管CPYTHON的线程库直接封装了系统的本机线程,但整个Cpython都是一个过程。同时,只有一个获得GIL的线程将运行,其他线程将在等待。这甚至在多核CPU中也会导致多线程切换。

  吉尔是Python的全球口译员锁。如果在同一过程中有多个线程,则在运行Python programrun时,线程将占据Python解释器,在线程运行后可以运行其他线程。如果线程运行时间 - 在线程操作期间,则耗时 - 耗尽的操作,解释器锁和其他线程运行。因此,在多线程中,线程的操作仍然是顺序的,而不是同时。

  在多过程中,每个过程都可以由系统分配,该系统等同于每个具有Python解释器的过程,因此多个过程可以实现多个过程并同时运行。缺点是流程系统资源开销很大。

  首先强调背景:

  1.什么是吉尔?

  GIL的全名是全球解释器锁(全局解释器锁)。该来源是由Python设计开始时考虑的,以决定数据安全。

  2.每个CPU只能同时执行一个线程

  单核CPU下的多线程线程实际上只是并发,而不是并行,并且从宏观角度同时是处理多通道请求的概念。,同时发生两个或更多事件;并发意味着在同一时间间隔内发生两个或多个事件。

  在Python多线程中,每个线程的执行方法:

  得到吉尔

  执行代码直到睡眠或Python虚拟机将其悬挂。

  释放吉尔

  可以看出,如果线程要执行,我们必须先获得GIL。我们可以将吉尔视为“通行证”,在一个python的过程中,吉尔只有一个。如果您无法获得通行证,则不允许您进入CPU。

  在python2.x中,吉尔的发行逻辑是当前的线程符合IO操作或计数100的刻度(可以将tick视为python本身的计数器,该反词是在GIL上专门起作用的。每次释放之后,可以通过SYS通过SYS。调整了.setCheckInterval)以释放它。

  每次释放GIL锁时,线程都会锁定和切换线程,这将消耗资源。由于存在GIL锁,Python中的一个过程只能同时执行线程(GIL的线程可以执行)。这就是为什么Python的多线程效率不高的原因。

  那么,Python的多线程完全没有用?

  在这里,我们进行分类讨论:

  CPU密集型代码(各种周期处理,计数等)。在这种情况下,由于计算工作的大量计算,刻度计数将很快达到阈值,然后触发吉尔的释放和重新竞争(当然,当然,当然,当然,当然,当然,当然,当然,当然,当然需要消耗),因此,Python下的多线程对CPU强度代码不友好。

  IO密集型代码(文件处理,网络爬网等),多线程可以有效提高效率(单线程下的IO操作将等待不必要的时间。编织线程B无法浪费CPU的资源,该资源可以可以提高程序的执行效率)。因此,Python的多线程对IO浓度代码更友好。

  在python3.x中,吉尔不使用tick count,并且更改为计时器的使用(执行时间达到阈值后,当前线程释放了GIL),因此CPU密度程序更友好,但是它仍然无法解决GIL引起的同一时间。能够执行线程的问题,因此效率仍然不令人满意。

  请注意:多核和多线程比单核多线程差,因为单核下的多线程多线程。每次发布GIL时,Wake -Up线程都可以获取GIL锁,因此可以无缝执行,但是在Multi -Core,CPU0,CPU0,GIL发布后CPU0,其他CPU上的线程可能会竞争,但GIL可能会进行立即由CPU0获得,从而导致其他几个CPU上的觉醒线被唤醒并等待,直到切换时间进入状态。三个线程凸起将导致效率较低。

  回到最初的问题:我经常听到退伍军人说:“如果您想在Python下充分利用多核CPU,则可以使用多进程。”是什么原因?

  原因是每个过程都有自己的独立GIL,并且不会彼此干扰,因此可以在真正的意义上并行实施,因此在Python中,多过程执行效率比多线程更好(仅是多线程(仅用于多核CPU)。

  因此,这里的结论是:在多核心下,您想并行提高效率。更常见的方法是使用多过程,可以有效提高执行效率

  最近,我正在观看Python的多线程线程,我们经常听到退伍军人说:“ python下的多线程是鸡肉肋骨,建议使用多进程!”但是你为什么这么说呢?

  要知道这一点,我们必须知道为什么。

  首先强调背景:

  1.什么是吉尔?

  GIL的全名是全球解释器锁(全局解释器锁)。该来源是由Python设计开始时考虑的,以决定数据安全。

  2.每个CPU只能同时执行一个线程(单核CPU下的多线程实际上只是并发,而不是并行,并且在Macro中同时存在并行差异,并且并行表示两个或多个事件同时发生;并发意味着在同一时间间隔内发生两个或多个事件。)

  在Python多线程中,每个线程的执行方法:

  1.吉尔

  2.执行代码直到睡眠或python虚拟机将其悬挂。

  3.释放吉尔

  可以看出,如果线程要执行,我们必须先获得GIL。我们可以将吉尔视为“通行证”,在一个python的过程中,吉尔只有一个。如果您无法获得通行证,则不允许您进入CPU。

  在Python2.x中,GIL的发行逻辑是当前的线程符合IO操作或计数100的刻度(可以将tick视为python本身的计数器,该计数器本身是专门用于GIL的。每次释放后,可以通过计数将此计数通过。该计数可以通过.sys.setCheckInterval进行了调整)以释放它。

  每次释放GIL锁时,线程都会锁定和切换线程,这将消耗资源。由于存在GIL锁,Python中的一个过程只能同时执行线程(GIL的线程可以执行)。这就是为什么Python的多线程效率不高的原因。

  那么,Python的多线程完全没有用?

  在这里,我们进行分类讨论:

  1. CPU密集型代码(各种循环处理,计数等)。在这种情况下,由于计算工作的大量计算,tick数将很快达到阈值,然后触发吉尔的释放和重新竞争(多个线程返回到来回返回,肯定需要资源),因此在python下有更多的资源

  Python具有GIL(全局解释器锁),因此只能串行执行同一Python解释器下的多线程任务。

  据了解,就吉尔而言,一项巨大的任务分为小任务,并计划到多个线程进行执行,这大大减少了。这是吉尔的直接结果。在优化了Python3.2版本之后,性能只能更接近单线程的性能。考虑框架(例如Java平台)的框架和加入框架,并且不可能在Python世界中按下它。

  GIL将自动释放GIL。sleep(),io操作等,以切换为其他线程运行,有时是并行执行的幻觉。对于CPU计算任务,通过SYS.SetCheckeckInterval设置了上下文切换频率()。

  烧瓶1.0版本,flask.run()在默认情况下以多线程运行。连接到线程的每个用户响应。结合上述分析,Python并不是一个真正的多线程,而是Epoll IO模型,promistingle -threaded友谊(例如Node.js)。因此,烧瓶程序进行了转换:

  在我的计算机上,对于100个线程和每个线程循环6次,平均响应约为330ms,多线程和GEVENT的实现是相似的,但是当将线程数添加到200中时,GEVENT稳定在330ms上,但是多线程的线程已达到600ms,线程调度的负担越来越重,并且请求的失败也出现了。

  在Gevent的帮助下,可以很好地提高烧瓶施用性能。

  由于python的臭名昭著的吉尔。

  那吉尔是什么?为什么有吉尔?多线程真的是鸡排吗?可以去除吉尔吗?如果有这些问题,我们在一起看着,同时需要一点耐心。

  是多线鸡肋骨吗?让我们先进行实验。实验非常简单。它是为了减少“ 1亿”的数量,并将其减少到0程序。如果我们使用单个线程执行,那么完成时间是什么?将使用多线程?显示我的代码

  单线

  在我的4台CPU计算机中,在单个线程上花费的时间为6.5秒。有人可能会问,线程在哪里?实际上,当任何程序运行时,默认情况下将有一个主线程执行。(关于线程和过程不会在这里扩展,我将分别打开一篇文章)

  多线程

  创建两个子线程T1和T2,每个线程执行5000万次执行,并且在执行两个线程后,主线程终止程序操作。结果,在合作中执行了两个线程,但合作执行了6.8秒,但放慢了速度从理论上讲,这两个线程同时在两个CPU上运行。时间应该减半,但现在没有减少。

  是什么导致多线程不现实和缓慢?

  原因在于吉尔。在Cpython解释器(Python语言中的主流解释器)中,有一个全局的解释锁。当解释器解释Python代码时,这意味着该锁首先意味着任何时间,可能只有一个线程执行代码。如果其他线程想获得CPU执行代码指令,则必须先获得此锁定。如果锁被其他线程占据,则线程只能等到锁的线程被锁的线占据,释放锁可能会执行代码指令。

  因此,这就是为什么两个线程在一起慢的原因,因为同时,只有一个线程正在运行,而其他线程只能等待。即使是多核CPU也可以在同一Timethe执行代码上同时使用多个线程“并行”,因为多线程切换和锁定机制处理(获取锁,释放锁等),因此可以交替执行。参与其中,因此多线程执行不是快速且缓慢。

  吉尔什么时候发布?

  当线程遇到I/O任务时,将发布GIL。当CPU结合线程执行100个口译器(ticks)(ticks)(ticks)(ticks)(可以大致认为是Python虚拟机)时,GIL也将是发布。您可以通过设置步骤长度来检查步骤的步骤。

  为什么Cpython的解释器设计这样?

  多线程是适应现代计算机硬件的高速开发,以充分利用多核处理器的产品。通过多线程,可以有效地使用CPU资源。Python出生于1991年。在Timethe Server 32 Core 64g内存并不常见

  但是,多线程存在问题。如何解决共享数据的同步和一致性问题,因为当多个线程访问和共享数据时,可能会有两个线程同时修改一个数据情况。如果没有合适的机制来确保Dathathen的一致性最终导致异常,因此Python的父亲具有全球线锁。无论您是否与数据有同步问题,无论如何,您都可以将其切成全局锁以确保数据安全性。这是多线程鸡排的原因,因为它没有对安全性的良好的控制数据,但以简单而粗鲁的方式解决。

  该解决方案放置在1990年代。实际上,没有问题。毕竟,当时的硬件配置仍然非常简单。单个核心CPU仍然是主流。run,不涉及线程的上下文切换,但是效率高于多线程(在多核环境中,此规则不适用)。因此,它不适用使用GIL确保数据的一致性和安全性所必需。至少在当时这是一种非常低的成本实施方法。

  删除吉尔是否可行?

  有人确实做了很多事情,但结果令人失望。1999年,两个伙伴格雷格·斯坦(Greg Stein)和马克·哈蒙德(Mark Hammond)创建了一个python分支,该分支将吉尔(Gil)删除并用更可变的数据结构取代了更细腻的数据结构。在单线条件下,Python的速度速度较慢。

  Python的父亲说:基于上述考虑,GIL在不必花费太多精力的情况下没有很大的价值。

  结论:以上是首席CTO的相关内容答案的摘要,请注意,GIL释放了多少毫秒gil,我希望它对您有所帮助!如果您解决问题,请与更多有关的朋友分享。关于这个问题?