【问题标题】:Pool.map from multiprocessing raises IndexError来自多处理的 Pool.map 引发 IndexError
【发布时间】:2014-04-01 15:45:17
【问题描述】:

我正在使用多处理来执行一堆串行任务。对于位于不同文件夹中的不同文件,这些任务每次都是相同的。每个任务都由对其他几个模块和 C++ 程序的调用组成。有一个高级包装器来管理对其他模块/功能的调用。在多处理代码执行开始时,会创建一个带有 id 和这个高级类的实例的列表。然后一个进程池执行任务。

它运行良好,直到引发模糊异常:

Traceback (most recent call last):
  File "test_parallel.py", line 197, in <module>
    pool_outputs = pool.map(do_calculations, zip(list_instances, list_IDs), )
  File "/usr/lib64/python2.6/multiprocessing/pool.py", line 148, in map
    return self.map_async(func, iterable, chunksize).get()
  File "/usr/lib64/python2.6/multiprocessing/pool.py", line 422, in get
    raise self._value
IndexError: tuple index out of range

通常在任务执行了很多次时提出(约 200 个计划中的第 100 个任务)。

代码的简化版本是:

import multiprocessing
if __name__=="__main__":
    which_subfields=range(200)
    pool_size = int( multiprocessing.cpu_count() )

    run = WrapperAroundModule.run(version = "parallel")

    if pool_size == 0: 
        pool_size=1

    list_IDs = list(which_subfields)
    lock=multiprocessing.Lock()
    runs = []

    for _ in which_subfields:
        runs.append(copy.deepcopy(run))

    pool = multiprocessing.Pool(processes=pool_size, )

    pool_outputs = pool.map(do_calculations, zip(list_instances, list_IDs), )

    pool.close()
    pool.join()

do_calculations 函数的签名为:do_calculations((instance, id))

我确定函数do_calculations是线程安全的,但是并没有改变这种情况,然后我想用maxtasksperchild,可惜我必须用python 2.6,模块Billard可以'不要安装在我正在使用的服务器上(运行科学的 linux)。因此,我写了一个解决方法:要执行的任务除以长度为pool_size*maxtasksperchild 的块。脚本使用类似的代码在池上执行这些任务。完成后,池及其周围的所有变量都将被删除,并为下一个任务创建一个新池。可悲的是,在某些时候仍然会出现错误。此外,我确保作为参数传递的两个列表足够长。 do_calculations 函数在多处理版本中失败的单个任务上运行流畅。

关于这个错误的来源和可能的更正的任何想法?

【问题讨论】:

    标签: multiprocessing python-2.6


    【解决方案1】:

    raise self._value 表示do_calculations 在子进程中引发异常,multiprocessing 在主进程中为您重新引发异常。

    要消除异常,请修复 do_calculations() 函数。用try/except 包装它并打印完整的回溯/本地信息以了解错误所在。

    【讨论】:

    • 好的,谢谢,我开始隔离错误,即使它根本不重要。
    猜你喜欢
    • 2019-01-30
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 2015-01-12
    • 2018-04-03
    相关资源
    最近更新 更多