【问题标题】:Pathos processing pool recursion limitPathos 处理池递归限制
【发布时间】:2016-10-28 14:17:01
【问题描述】:

我有一个任务要与悲情并行。当我运行非并行版本时,它运行得很好。但是,运行一个包含 1 个进程的 pathos 池会导致 RuntimeError: maximum recursion depth exceeded。

例如:

import pathos.multiprocessing as mp
pool = mp.ProcessPool(1)
def _worker(fx):
    return fx[0](fx[1],fx[2])

在尝试调试为什么会发生此错误时,我尝试映射一个对象的列表。这无需多处理即可工作

>>> map(_worker, izip([t1.getValue], repeat(a_all), repeat(penalties)))
[-0.34375]

t1.getValue 是要应用的昂贵函数。我有一个完整的列表,这些函数适用于相同的两个参数。这就是并行处理的用武之地。但是,以下会引发错误:

>>> pool.map(_worker, izip([t1.getValue], repeat(a_all), repeat(penalties)))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/pathos/multiprocessing.py", line 136, in map
    return _pool.map(star(f), zip(*args)) # chunksize
  File "/usr/local/lib/python2.7/site-packages/multiprocess/pool.py", line 251, in map
    return self.map_async(func, iterable, chunksize).get()
  File "/usr/local/lib/python2.7/site-packages/multiprocess/pool.py", line 567, in get
    raise self._value
  RuntimeError: maximum recursion depth exceeded

有趣的是getValue 不是递归的。我知道这有时会在达到堆栈限制时发生。

我如何确定getValue 的哪一部分导致错误使多处理工作正常?我被卡住了,因为我不知道如何从这一点上调试它。将数据传递给进程时,这是否可能实际上是由酸洗错误引起的? getValue 确实在幕后处理了一些大型结构。

【问题讨论】:

    标签: python recursion parallel-processing multiprocessing pathos


    【解决方案1】:

    你可以尝试使用sys.setrecursionlimit()来增加递归的限制,如:

    import sys
    sys.setrecursionlimit(1000000)
    

    【讨论】:

    • 这是一个可怕的想法,解决了症状而不是问题
    猜你喜欢
    • 1970-01-01
    • 2013-12-01
    • 2014-09-13
    • 2016-08-13
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 2015-05-21
    • 2020-01-26
    相关资源
    最近更新 更多