python多线程能占满整个多核cpu吗,python 多核cpu

  python多线程能占满整个多核cpu吗,python 多核cpu

  本文主要介绍使用多核cpu的python多线程分析。有需要的朋友可以借鉴一下,希望能有所帮助。祝大家进步很大,早日升职加薪。

  00-1010介绍运行这段代码前的cpu状态,运行代码后的状态,运行代码的结果,python线程的执行过程明白遇到IO时GIL也会被释放。

  

目录

  我们经常听到‘因为GIL的存在,python的多线程无法利用多核CPU’。现在让我们抛开GIL,python可以利用多核CPU吗?今天做了一个实验,代码很简单如下。

  而1:

  及格

  

引言

  

没有运行这段代码前cpu状态

  下面两张图是跑步后的状态。当然,这只是两张代表图,截图间隔十秒。

  根据第一张图,我们发现cpu1和cpu3的负载明显增加,可以得出python线程可以利用多核cpu的结论。我们以为python运行后会绑定cpu的一个核心,现在看起来不是这样的。第二张图更有趣。cpu2满载。为什么?

  想想应该是linux中cpu对进程的亲和力造成的。这种亲和力是软性的,但不是强制性的,这也解释了为什么第一张图中加载了多个CPU。

  好了,为了更直观的看到python线程可以利用多核cpu,我们把代码改一下,换一种方式来看。

  导入操作系统

  而1:

  Print.getpid () #输出进程号

  

运行之后的状态

  乍一看,线程确实在不同的内核上切换。

  现在我们再来回顾一下经典的那句话‘因为GIL的存在,python的多线程无法利用多核CPU’。这句话很容易理解为GIL会让python在一个内核上运行。我们用今天的例子来重新理解这句话。GIL的存在使得python只有一个线程同时运行。这是毫无疑问的,但它不锁线程,也不指定只能在某个CPU上运行。此外,我需要解释一下GIL。

  

运行代码结果

  线程——抓取GIL——CPU

  这个执行过程导致了cpu密集型的多线程程序在可以利用多核cpu的情况下和单核CPU差不多,由于多线程抢GIL,运行效率=单线程。

  看到这里可能会给人一种错觉,python用GIL是线程安全的,好像根本不需要线程锁。然而,实际情况是线程在获得CPU资源后并不总是执行。python解释器在执行100个字节码时会释放线程的GIL(注意字节码不是代码)。如果此时没有添加锁,其他线程可能会修改该线程使用的资源;

  

python线程的执行流程理解

  另一个问题是,当遇到木卫一时,GIL将被释放。以下是这两种情况的例子。

  导入线程

  a=[]

  定义m1():

  for _ in范围(100000):

  a .追加(1)

  定义m2():

  for _ in范围(100000):

  a .追加(2)

  定义检查():

  检查a是否正常。

  对于范围内的I(len(a)):

  如果我!=0:

  如果a[I]lt;一个:

  打印一个[i-1],一个[i]

  返回False

  返回True

  t1=线程。线程(目标=m1)

  t2=线程。线程(目标=m2)

  t1.start()

  t2.start()

  t1.join()

  t2.join()

  打印支票()

  预期1111.2222 .截图显示和预期的不一样。

  导入线程

  text1=1 * 10000

  text2=2 * 10000

  定义写(文本):

  用open(test.txt , a )作为f:

  f.write(文本)

  定义m1():

  写(文本1)

  定义m2():

  书写(文本2)

  t1=线程。线程(目标=m1)

  t2=线程。线程(目标=m2)

  t1.start()

  t2.start()

  t1.join()

  t2.join()

  Test.txt截图

  最后,因为GIL的存在,python的多线程可以利用多核CPU,但是不能让多核同时工作。

  以上是python多线程对多核cpu的利用和分析的详细内容。关于python多线程利用多核cpu的更多信息,请关注盛行IT软件开发工作室的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: