Py学习  »  Python

子进程不会在并行多处理Python中运行

Sénéchal Julien • 3 年前 • 1160 次点击  

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

我的3个进程通过套接字(multiprocessing.connection.Listener/Client)与主进程通信。不同的进程各自读取不同的文件,因此不应存在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()

提前感谢您的帮助

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/129809
 
1160 次点击  
文章 [ 1 ]  |  最新文章 3 年前
Masklinn
Reply   •   1 楼
Masklinn    3 年前
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级带宽,所以你至少需要读取数百MBs的文件才能感觉到这种效果(如果你使用非常低效的读取方法,可能会更少)。

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

而且

不同的进程各自读取不同的文件

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