子进程不 运行 并行 - 多处理 Python

Subprocesses don't run in parrallel - Multiprocessing Python

我尝试了很多方法来同时调用我的子进程 运行 它们。它创建所有进程,但 运行 一次只创建一个进程。

我的 3 个进程通过套接字(multiprocessing.connection.Listener / 客户端)与我的主要进程通信。不同的进程各自读取不同的文件,因此应该没有 I/O 麻烦。

这里有我尝试过的所有内容:

1.

pool = Pool(cpu_count())
j = 0
while j < procs:
    pool.apply_async(run, args=())
    sleep(0.2)
    j += 1
pool.close()
j = 0
while j < procs:
    processes.append(Process(target=run, args=()))
    processes[-1].start()
    sleep(0.2)
    j += 1
pool = Pool(cpu_count())
j = 0
while j < procs:
    pool.apply(run, args=())
    sleep(0.2)
    j += 1
pool.close()

提前感谢您的帮助

pool = Pool(cpu_count())

没用,这是默认行为

pool.apply_async(run, args=())
sleep(0.2)

这会提交 一个 任务,因为你在之后睡觉,除非任务花费超过 200 毫秒(这不太可能,200 毫秒 很多) 所有提交都将按顺序提交

processes.append(Process(target=run, args=()))
processes[-1].start()
sleep(0.2)

同上,除了可能更糟(不清楚 start() 的阻塞行为是什么)。

pool.apply(run, args=())
sleep(0.2)

apply 正在阻塞,因此这将向队列提交一个作业 并等待该作业完成 .

只有第一个版本才有机会利用池,并且由于您在提交后休眠了 200 毫秒,作业需要至少 200 毫秒才能并行化。

你根本没有解释 run 的作用,你唯一说的是它们正在读取文件,但即使是入门级 SSD 也有 GB/s-scale 带宽,所以你会至少需要读取数百 MB 的文件才能使这种效果变得合理(如果您使用的是非常低效的读取方法,则可能更少)。

使用进程池的正确方法是 apply_async 紧密循环,或者使用 map_asyncimap_unordered 将作业分批发送到池中,然后让池在工人之间分配工作。

还有

The different processes each read different files

当然没有任何迹象或证据表明,因为它们都是 运行 相同的 run 函数,没有参数。