我正在尝试使用Pool将所有作业均匀地分配给16个处理器。我注意到最初会产生16个进程。几秒钟后,只有2个进程执行其余一小部分工作的所有工作。无论我增加多少负载,似乎都会稳定减少在此工作上工作的进程数。最终,只有1或2个进程通过其余作业。
以下是我的代码中的多进程片段。
以下是我的代码中的多进程片段。
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
? - zwerworks
中的项目数量达到了百万甚至十亿级别,那么我认为使用Pool
比创建大量的Process
更加适合。 - Raja