悲怆多处理不能腌制

Posted

技术标签:

【中文标题】悲怆多处理不能腌制【英文标题】:pathos multiprocessing cannot pickle 【发布时间】:2016-01-05 15:48:41 【问题描述】:

我遇到了与此person 类似的问题。我无法在 pathos 模块中运行简单的多处理例程并收到酸洗错误。下面是代码和错误。

from pathos.multiprocessing import ProcessingPool
import dill
class ProcClass(object):
    def __init__(self):
        pass
    def f(self,x):
        return x*x
pc = ProcClass()
pl = ProcessingPool(3)
print pl.map(pc.f, range(10))

返回的错误:

Exception in thread Thread-2:
Traceback (most recent call last):
  File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/threading.py", line 551, in __bootstrap_inner
    self.run()
  File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/threading.py", line 504, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/multiprocessing/pool.py", line 320, in _handle_tasks
    put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed

我已经安装了:pp、dill、pox 和 multiprocessing,然后安装了 pathos。安装有效,但总是给我这个错误:


警告:以下依赖项之一未解决: pp(ft) >=1.6.4.5 莳萝 >=0.2.4 痘>=0.2.2 (多)处理


根据 pathos 的作者对类似问题的回复,安装似乎存在问题。我已经删除并重新安装了几次,每次都验证安装了正确的依赖项。我在 MacOS 上运行并使用 python 2.7。 任何帮助将不胜感激!

【问题讨论】:

我是上述软件包的作者。您能否详细说明您是如何安装的,以及您安装了哪些版本?我主要使用 MacOS 和 python2.7,所以测试你的安装应该很简单。 从您的回溯中,您似乎正在使用multiprocessingthreadingpickle 的标准库版本。本质上,没有看到您说您安装的任何软件包。 我首先下载了源 [pathos-master] (github.com/uqfoundation/pathos) 并运行了 python setup.py install 并尝试了它,但没有成功。然后我从我的站点包中删除了多处理(以及 pathos),再次安装了 pathos 的依赖项,并全新安装了 pathos。还是不行。 如果我尝试使用常规多处理运行,我确实会得到一个稍微不同的错误:PicklingError: PicklingError: Can't pickle : attribute lookup builtin。 instancemethod 失败而不是之前的:Can't pickle : attribute lookup builtin.function failed。我不知道这是否有帮助,但有区别。 我要问的是你能告诉我你是如何安装所有依赖项的以及它们的版本是什么吗?例如,这应该工作:&gt;$ pip install setuptools 然后&gt;$ pip install git+https://github.com/uqfoundation/pathos.git@master。然后,您可以通过导入并查看 pathos.__version__ 来检查版本,例如。您还应该确保安装到与您使用的 python 相同的站点包——我知道这很明显,但我见过人们这样做。 【参考方案1】:

您似乎缺少关键依赖项。对于pathos,您应该使用multiprocess,它是使用dill 序列化程序的multiprocessing 的一个分支。

>>> import multiprocessing
>>> multiprocessing.__version__
'0.70a1'
>>> import multiprocess   
>>> multiprocess.__version__
'0.70.4.dev0'
>>> 
>>> multiprocess.Pool().map(lambda x:x*x, range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> 

【讨论】:

谢谢@Mike McKerns。这是一件很奇怪的事。我试图简单地单独导入多进程但不能,因为我从 subprocess.py 收到以下错误:ImportError: cannot import name _args_from_interpreter_flags。事实证明,我无法从 subprocess 模块导入 _args_from_interpreter_flags。这是因为它根本不存在。我不知道为什么没有。解决方案是下载 python2.7 并简单地复制并粘贴 subprocess.py。上面的示例代码现在可以工作了。【参考方案2】:

我遇到了类似的错误。我将导入部分更改为:

from pathos.multiprocessing import ProcessingPool

到:

import pathos, multiprocess
from pathos.multiprocessing import ProcessingPool
import dill

并且代码有效。不知道发生了什么。也许就像迈克在另一个answer 中提到的那样,pathos 正在寻找捆绑multiprocessing 包而不是multiprocess 的系统。也许明确地导入它以某种方式解决了这个问题......

【讨论】:

以上是关于悲怆多处理不能腌制的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能腌制一个 typing.NamedTuple 而我可以腌制一个 collections.namedtuple?

Python进程不能腌制

Python多处理-TypeError:无法腌制'_tkinter.tkapp'对象

准确确定在 Python 多处理期间腌制的内容

Python 多处理 PicklingError:无法腌制 <type 'function'>

Python多处理:AttributeError:无法腌制本地对象