Python 多处理程序仅使用 4 个核心中的 1 个

Python 多处理程序仅使用 4 个核心中的 1 个

我使用的是 Ubuntu 17.04 64 位,处理器为 Intel® Core™ i7-7500U CPU @ 2.70GHz × 4 和 16GB RAM。系统监视器显示 3 个 Python 进程,查看资源后发现,只有 1 个核心利用率达到 100%,其余 3 个仅为 2-3%。

据我所知,不同的进程在不同的核心上执行,对吗?

正在执行的代码是:

import time
import multiprocessing

def boom1(*args):
    print(5**10000000000)

def boom2(*args):
    print(5**10000000000)   

def boom3(*args):
    print(5**10000000000)   

def boom4(*args):
    print(5**10000000000)

if __name__=="__main__":
    array = []
    p1 = multiprocessing.Process(target=boom1, args=(array,))
    p2 = multiprocessing.Process(target=boom1, args=(array,))
    p3 = multiprocessing.Process(target=boom1, args=(array,))
    p4 = multiprocessing.Process(target=boom1, args=(array,))

    p1.start()
    p2.start()
    p3.start()
    p4.start()


    p1.join()
    p2.join()
    p3.join()
    p4.join()

    print('Done')

答案1

您的多线程非常好,但执行的代码并不符合您的预期。

尝试运行此代码

def boom1():
    print(5**10000000000)

if __name__=="__main__":
    print('Done')

是的,boom1 函数未被调用,但您会看到 1 个线程仍在尝试执行“某事”,并且需要很长时间。实际上,这个“某事”是 ConstantExpressionEvaluator - 出于性能原因,它会尝试预先计算常量表达式,但您的常量太大,以至于需要花费所有时间才能完成。要打破这种单线程优化并并行运行代码,只需在计算中添加这个额外的步骤。

像这样

def boom1():
    z = 5 ** 10
    z = z ** 1000000000
    print(z)

相关内容