多进程加速 VS 核心数量

6

我的笔记本有4个核心,在进行一些简单的测试后,我发现使用多进程处理4个或更多任务时,我的CPU使用率达到了100%,处理3个任务时为75%,处理2个任务时为50%,处理1个任务时为25%。这对我来说是非常合理的。

然后我发现在使用多进程时,我的程序执行速度比单进程快了4倍,但是我感觉它不应该总是快四倍。

例如,如果我运行5个任务,由于只有4个核心可用,那么我的第5个任务不应该被排队等待直到其中任何一个任务完成吗?换句话说,如果所有的任务都是相同的,并且每个任务需要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秒,并且操作系统调度器试图确保所有进程都获得平等的时间份额,那么T秒后,我的前4个作业应该已经完成了。然后只有一个核心能够处理最后一个作业,所以总时间将为T+T = 2T秒,对吗?总时间不再是6T / 4了。


我认为我的后续问题的答案是肯定的,我已经亲自测试过了。 - Arch1tect
1个回答

8
您创建了五个进程。因此,所有五个进程“同时”运行。您的操作系统调度程序将根据其调度算法,通常尝试确保所有进程获得平等的时间份额,勤勉地运行所有五个进程。
因此,这五个进程将都获得大约相同数量的CPU时间,它们最终将在大约相同的时间结束。
如果您想看到“预期”的行为,请使用4个工作程序创建一个multiprocessing.Pool并提交5个作业。 Pool 将仅使用四个进程,这些进程将按顺序处理传入的作业。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接