我在运行python和多处理的Amazon实例上遇到了一个非常奇怪的问题。
上下文
我想使用pool.map
或类似的东西(imap_unordered
也可以做到这一点)将CPU密集型任务应用于迭代。迭代不是那么大(几百),但任务需要很长时间。
我在Python 2.7.11中使用Python的multiprocessing
模块
一般结构是:
for longer_loop:
for small loop:
pool = Pool(processes=18)
pool.map(f, iterable)
pool.close()
pool.join()
问题
我开始跑步。我去看看“顶部”并看到Python很好地使用它们的核心。我去做别的事。我回过头来看,突然间Python仍处于较长的循环中,但现在只使用一个核心,并完全停止利用多处理。要强调:它不会挂起。东西仍在发生。但它一次发生一件事,而不是18件。
我尝试的事情(没有帮助)
第一直觉:这是一个负载平衡问题,因为该函数需要很长但稍微变化的时间,所以有些核心只是提前完成。将chunksize设置为1,因为瓶颈肯定是应用的函数,而不是创建大量的块。这没有用。
第二直觉:我依稀记得numpy和python多处理没有很好地凝聚。在环境变量中设置OMP_NUM_THREADS=1
。虽然似乎首先帮助(通过使一切运行得更快),但是执行时间更长的运行(比我的“让我们先测试这些东西更多的数据”)的数据仍然停留在“只有一个帖子“。
注意:我在小循环之外创建了池,但这并没有改变任何东西。地图的实际执行花费的时间最多,因此关闭和重新创建Pool对象将是无关紧要的。
更多怀疑它可能是什么
目前正在尝试运行我处理核心亲和力问题,但我觉得如果这是问题,那么我应该从一开始就看到它,而不是在以后某个未确定的时间。
亚马逊EC2实例是否有一些奇怪的说法“为你提供足够的核心,傻瓜!”创建过多的进程后?
是否与使用太多内存有关?但后来我只期望看到18个勤奋(和1个监控)的python进程,刚才他们都在忙着交换东西,因为它们已经没有内存了。但我真的只看到一个工作流程(和1个监控流程)在循环中辛苦工作,好像map
或imap_unordered
)决定1现在已经足够了。哪个......不应该发生。
对任何线索和指针感到高兴,并乐意在必要时提供更多信息。