多处理速度与内核数量的关系

Multiprocessing speed up vs number of cores

我的笔记本电脑有 4 个内核,经过一些简单的测试,我发现当我使用 4 个或更多作业的多处理时,我的 CPU 使用率为 100%,3 个作业时约为 75%,大约50% 有 2 个工作,25% 有 1 个工作。这对我来说非常有意义。

然后我发现我的程序在多处理下运行我的作业快了 4 倍,但是 我觉得它不应该总是快 4 倍。

例如,如果我有 运行 5 个作业,我的第 5 个作业是否应该排队并仅在这 4 个作业中的任何一个完成后才被处理,因为我只有 4 个核心可用?换句话说,如果所有作业都是相同的,并且每个作业都需要 T 秒,所以在没有多处理的情况下它们需要 5T 秒,那么在给定 4 个内核来拆分工作的情况下,他们不应该花费 2T 来处理多处理吗?

但是,我的测试结果是多处理时大约 5T/4。我真的很好奇为什么,下面是我的测试代码:

import multiprocessing
import time
def worker(num):

    print ("Worker"+str(num)+" start!")
    for i in range(30000000):
        abc = 123
    print ("Worker"+str(num)+" finished!")
    return



if __name__ == '__main__':
    jobs = []
    start = time.time()

    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(i,))
        jobs.append(p)
        p.start()
        # p.join()


    for job in jobs:
        job.join()

    end = time.time()
    print (end - start)

编辑: 在阅读@nneonneo 的回答后,我提出了这个后续问题:

如果我的 5 个作业花费的时间不同,而是 T、T、T、T 和 2T 秒,并且 OS 调度程序试图确保所有进程获得相同的时间份额,那么T 秒后,我的前 4 个工作将完成。那么只有我的一个核心可以完成最后一项工作,所以总时间将是 T+T = 2T 秒,对吗?总时间将不再是 6T/4。

您创建了五个进程。因此,所有五个 运行 "at the same time"。您的 OS 的调度程序将根据其调度算法尽职地 运行 所有五个进程,该算法通常会尝试确保所有进程获得均等的时间份额。

因此,五个进程都将获得大约相同的 CPU 时间,因此它们将在大约相同的时间完成。

如果您想查看 "expected" 行为,请创建一个具有 4 个工人的 multiprocessing.Pool 并向其提交 5 个作业。 Pool 将仅使用四个进程来连续处理传入的作业。