来自多重处理的Pool.map引发IndexError

Jol*_*orc 1 python-2.6 multiprocessing

我正在使用多处理来执行一系列串行任务。这些任务在位于不同文件夹中的不同文件上都是相同的。每个任务由对其他几个模块和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
Run Code Online (Sandbox Code Playgroud)

通常当任务已经进行了很多次(〜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()
Run Code Online (Sandbox Code Playgroud)

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

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

是否知道此错误的根源以及可能的更正?

jfs*_*jfs 6

raise self._value 意思是 do_calculations在子流程引发了异常,并multiprocessing在主流程中为您重新提出了异常。

要摆脱异常,请修复do_calculations()功能。将其包装起来try/except并打印完整的回溯/本地信息,以了解错误所在。