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
将批量作业发送到池中,并让池在工人之间分配工作。
而且
不同的进程各自读取不同的文件
当然没有任何迹象或证据表明这一点,因为它们运行的都是相同的
跑
没有参数的函数。