使用 for 循环时多重处理需要更长的时间

问题描述 投票:0回答:2

我刚刚看完这个关于多处理的视频,在玩的过程中,我对使用 for 循环时发生的速度变慢感到困惑。

在视频中,执行以下代码来演示多处理的速度

    a = mp.Process(target=counter, args=(25000000,))
    b = mp.Process(target=counter, args=(25000000,))
    c = mp.Process(target=counter, args=(25000000,))
    d = mp.Process(target=counter, args=(25000000,))

    a.start()
    b.start()
    c.start()
    d.start()

    b.join()
    a.join()
    c.join()
    d.join()

我看到这个并想:“为什么不直接使用 for 循环呢?我有 16 个 CPU 核心,不想写出 16 个变量名”

因此,作为开始,我将代码更改为

    processes = []
    for i in range(1, 4):
        processes.append(mp.Process(target=counter, args=(250000000,)))
    
    for i in range(len(processes)):
        processes[i].start()
    for i in range(len(processes)):
        processes[i].join()

当执行此操作时,与单个变量代码的时间相比,所花费的时间要长得多(10.8 秒,而只有 1.8 秒)。为什么会发生这种事?

python for-loop multiprocessing
2个回答
0
投票

这部分是罪魁祸首:

for i in range(len(processes)):
    processes[i].join()

在这里,您等待每个进程一一完成,这使得您的代码有效地顺序化。我认为你应该尝试在这里使用ProcessPool同时加入多个线程


0
投票

导入多重处理 导入时间

定义工作(项目): # 模拟一些计算工作 结果 = 项目 * 项目 time.sleep(0.1) # 模拟计算工作 返回结果

定义主函数(): 数据=列表(范围(1000))

# Sequential execution
start_time = time.time()
results_seq = [work(item) for item in data]
seq_time = time.time() - start_time

# Parallel execution with multiprocessing
start_time = time.time()
with multiprocessing.Pool() as pool:
    results_parallel = pool.map(work, data)
parallel_time = time.time() - start_time

print(f"Sequential Time: {seq_time} seconds")
print(f"Parallel Time: {parallel_time} seconds")

if name == "main": 主要()

© www.soinside.com 2019 - 2024. All rights reserved.