子进程不 运行 并行 - 多处理 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_async
或 imap_unordered
将作业分批发送到池中,然后让池在工人之间分配工作。
还有
The different processes each read different files
当然没有任何迹象或证据表明,因为它们都是 运行 相同的 run
函数,没有参数。
我尝试了很多方法来同时调用我的子进程 运行 它们。它创建所有进程,但 运行 一次只创建一个进程。
我的 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_async
或 imap_unordered
将作业分批发送到池中,然后让池在工人之间分配工作。
还有
The different processes each read different files
当然没有任何迹象或证据表明,因为它们都是 运行 相同的 run
函数,没有参数。