多处理速度加快核心数量

Arc*_*ect 5 python parallel-processing multithreading multiprocessing

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

然后我发现我的程序在多处理过程中运行的速度提高了4倍,但我觉得它不应该总是快4倍.

例如,如果我正在运行5个作业,那么我的第5个作业是否应该排队并且只有在完成这4个作业中的任何一个之后才能处理,因为我只有4个核心可供使用?换句话说,如果所有作业都是相同的,并且每个作业需要T秒,所以它们需要5T秒而不需要多处理,那么它们是否应该采用2T来处理多处理,给定4个核心来分割工作?

但是,我的测试结果大约是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)
Run Code Online (Sandbox Code Playgroud)

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

如果我的5个作业没有花费相同的时间,但T,T,T,T和2T秒,并且OS调度程序试图确保所有进程获得相等的时间,那么T秒后,我的前4个作业将完成.然后我的核心中只有一个可以在最后一个工作上工作,因此总时间将是T + T = 2T秒,对吧?总时间不再是6T/4.

nne*_*neo 7

您创建了五个流程.因此,所有五个"同时"运行.您的操作系统调度程序将根据其调度算法尽职尽责地运行所有五个进程,这通常会尝试确保所有进程获得相同的时间.

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

如果要查看"预期"行为,请创建一个multiprocessing.Pool包含4个工作人员并向其提交5个作业.该Pool会只使用四个进程,这将顺序处理传入的作业.