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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。