Pathos处理池递归限制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pathos处理池递归限制相关的知识,希望对你有一定的参考价值。

我有一项任务,我正试图与悲伤并行化。当我运行非并行版本时,它运行得很好。但是,运行1进程的pathos池会导致RuntimeError:超出最大递归深度。

例如:

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确实处理幕后的一些大型结构。

答案

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

import sys
sys.setrecursionlimit(1000000)

以上是关于Pathos处理池递归限制的主要内容,如果未能解决你的问题,请参考以下文章

如何运行嵌套的、分层的 pathos 多处理地图?

pathos:并行处理选项 - 有人可以解释其中的差异吗?

多处理-> pathos.multiprocessing 和 windows

pathos pools:在 N 个任务后更新工作进程

Pathos 多处理不能调用类中的任何包和函数

Python多处理,在循环中多次使用池在第一次迭代后卡住