我在拥有8个cpu-s的计算机上尝试python3
multiprocessing
,每个cpu有4个核心(信息来自/proc/cpuinfo
)。我写了一个带有无用功能的小脚本,我使用time
来查看它完成所需的时间。
from multiprocessing import Pool,cpu_count
def f(x):
for i in range(100000000):
x*x
return x*x
with Pool(8) as p:
a = p.map(f,[x for x in range(8)])
#~ f(5)
在没有多处理的情况下调用f()
需要大约7s(time
的“实际”输出)。如上所示,使用8个池调用f()
8次,再次大约需要7秒。如果我用4个池调用它8次,我会得到13.5s左右,所以启动脚本会有一些开销,但它会运行两倍。到现在为止还挺好。现在这里是我不理解的部分。如果有8个cpu-s,每个有4个核心,如果我用32个池调用它32次,据我所知它应该再运行7s左右,但它需要32s,实际上比运行时间略长{{} 1}}在8个池上32次。
所以我的问题是f()
无法使用核心,或者我不了解内核的某些内容,还是其他内容?
答案 0 :(得分:0)
简化和简短.. Cpu和核心是您的计算机所具有的硬件。在这个硬件上有一个操作系统,硬件和计算机上运行的程序之间的中间人。计算机上运行的程序分配了cpu时间。其中一个程序是python interpetar,它运行所有具有endswith .py的程序。因此,计算机上的cpu时间,时间被分配给python3。*,这反过来又分配给你正在运行的程序的时间。此速度取决于您拥有的硬件,正在运行的操作以及所有这些实例之间的cpu-time分配方式。
如何分配cpu-time?这就像一个while循环,操作系统在程序之间分配增量,而python解释器是增量分配它的发布时间到python解释器运行的程序。这就是整个计算机在程序出现异常时停止的原因。
许多流程不等于对硬件的更多访问权限。它确实等于从python解释器分配的时间分配更多的cpu-time。因为你增加了python解释器下适用于你的应用程序的程序数量。
许多流程确实等于更多的工作马匹。
您在代码中实际看到了这一点。你将workhorses的数量增加到python解释器所分配的cpu-time被分成如此多的进程之间所有这些进程都会减慢的程度。