【发布时间】:2017-12-07 10:05:59
【问题描述】:
我正在尝试使用 Pool 在 16 个处理器之间平均分配我的所有作业。我注意到最初产生了 16 个进程。几秒钟后,只有 2 个进程执行少量作业的所有剩余作业。无论我增加多少负载,似乎都在减少处理它的进程。最终,只有 1 或 2 个进程完成剩余的作业。
这是我的代码中的多处理 sn-p。
c_size = len(sampled_patterns) / (cpu_count() -1)
pool = Pool(processes=cpu_count() -1)
works = [(pattern, support_set, hit_rates) for pattern,support_set in sampled_patterns.items()]
pool.starmap(get_hit_rules,works, chunksize=int(c_size))
是否可以使用所有 16 个处理器来最大化并行化?谢谢!
编辑! 这就是分配任务的方式。以 pid 为键,任务数为值的计数器。
Counter({30179: 14130, 30167: 13530, 30169: 12900, 30173: 12630, 30165: 12465, 30177: 12105, 30163: 11820, 30175: 11460, 30161: 10860, 30181: 10725, 30183: 9855, 30157: 8695, 30159: 6765, 30171: 4860, 30155: 1770})
【问题讨论】:
-
chunksize没有做您认为正在做的事情 - 如果您想将works可迭代拆分为大小均匀,请将其设置为您在池中拥有的进程数(即pool._processes)对池中所有进程的块。但是,如果你想这样做,真正的问题是你为什么需要Pool? -
谢谢。这是我使用多处理的第一个代码。我使用 Pool 是因为代码看起来不像生成许多进程那么可怕。我以为 Pool 会为我处理好这件事。刚刚在阅读 Pool vs Process 有没有更好的方法?
-
我将在
works中拥有数百万甚至数十亿的项目。所以我认为Pool比产生尽可能多的Process更适合。 -
更改卡盘尺寸没有帮助!!
标签: python python-3.x multiprocessing python-multiprocessing