Amazon EC2上的Python多处理最终转向单核

时间:2016-03-23 17:19:11

标签: python amazon-ec2 python-multiprocessing

我在运行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个监控流程)在循环中辛苦工作,好像mapimap_unordered)决定1现在已经足够了。哪个......不应该发生。

对任何线索和指针感到高兴,并乐意在必要时提供更多信息。

0 个答案:

没有答案