Python多处理行为,进程数大于内核数

时间:2018-09-22 00:21:18

标签: python multiprocessing

我正在尝试使用Python的multiprocessing库,并希望了解其在不同数量的进程中的行为。

我假设将进程设置为大于内核数并没有任何好处。与该假设相反,下面的实验代码说,即使进程数超过核心数(在我的情况下为4),计算时间也会减少。

有人可以解释一下幕后发生的事情,并提供一些有关如何设置进程数的实用指南吗?

from multiprocessing import Pool, cpu_count
import time
from datetime import datetime

我的CPU计数。

cpu_count()
# 4

一项实验性任务,大约需要0.5秒。

def f(x):
    time.sleep(0.5)
    return x*x

def execute_time(processes):
    t1 = datetime.now()
    with Pool(processes) as p:
        p.map(f, list(range(36)))
    t2 = datetime.now()
    return t2 - t1

for p in range(1, 25):
    t = execute_time(p)
    print(p, ":", t)

收益:

# 1 : 0:00:18.065411
# 2 : 0:00:10.051516
# 3 : 0:00:06.057016
# 4 : 0:00:04.562439
# 5 : 0:00:04.069810
# 6 : 0:00:03.173502
# 7 : 0:00:03.065977
# 8 : 0:00:03.082625
# 9 : 0:00:02.092880
# 10 : 0:00:02.090963
# 11 : 0:00:02.061613
# 12 : 0:00:01.704716
# 13 : 0:00:01.704880
# 14 : 0:00:01.615440
# 15 : 0:00:01.625117
# 16 : 0:00:01.621259
# 17 : 0:00:01.639741
# 18 : 0:00:01.236108
# 19 : 0:00:01.250113
# 20 : 0:00:01.255697
# 21 : 0:00:01.253459
# 22 : 0:00:01.260632
# 23 : 0:00:01.262124
# 24 : 0:00:01.247772

有意义的是,该功能需要18秒的时间(36 * 0.5秒= 18秒)。具有四个过程(18秒/ 4 = 4.5秒)的情况也是如此。但是令我惊讶的是,随着处理数量的增加,计算时间会减少。

1 个答案:

答案 0 :(得分:0)

正如迈克尔·布彻(Michael Butscher)在评论中所说,这是def f(x): out = 0 for i in range(5000000): out += i return x*x def execute_time(processes): t1 = datetime.now() with Pool(processes) as p: p.map(f, list(range(36))) t2 = datetime.now() return t2 - t1 for p in range(1, 25): t = execute_time(p) print(p, ":", t) 的一种特殊行为。在执行CPU密集型任务时,我看到了好处在于进程数等于内核数。

# 1 : 0:00:13.329320
# 2 : 0:00:07.528552
# 3 : 0:00:09.943043
# 4 : 0:00:07.756005
# 5 : 0:00:08.262304
# 6 : 0:00:07.653659
# 7 : 0:00:07.677038
# 8 : 0:00:07.591766
# 9 : 0:00:07.502283
# 10 : 0:00:07.710826
# 11 : 0:00:06.006874
# 12 : 0:00:09.720279
# 13 : 0:00:07.912836
# 14 : 0:00:07.616807
# 15 : 0:00:07.740225
# 16 : 0:00:07.721783
# 17 : 0:00:07.836259
# 18 : 0:00:07.665993
# 19 : 0:00:07.564645
# 20 : 0:00:07.653607
# 21 : 0:00:07.754377
# 22 : 0:00:07.886036
# 23 : 0:00:11.696323
# 24 : 0:00:07.674243

获取:

availabiities