悲怆的多处理不能腌制

2 人关注

我有一个与此类似的问题 person .我无法在pathos模块中运行一个简单的多处理例程,并收到一个pickling错误。 下面是代码和错误。

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

The returned error:

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。安装工作正常,但总是给我这样的错误。

WARNING: One of the following dependencies is unresolved: pp(ft) >=1.6.4.5 dill >=0.2.4 pox >=0.2.2 (multi)processing

根据pathos的作者对一个类似问题的回应,看起来安装时有问题。我已经删除并重新安装了好几次,每次都验证了正确的依赖关系已经安装。我在MacOS上运行,使用python 2.7。 如果有任何帮助,我将不胜感激

5 个评论
我是上述软件包的作者。你能更详细地说明你是如何安装的,以及你安装了哪些版本? 我主要使用MacOS和python2.7,所以测试你的安装应该是很简单的。
从你的追踪来看,你使用的是 multiprocessing threading pickle 的标准库版本。 基本上,没有看到你说你安装的任何软件包。
RHam
我首先下载了源代码[pathos-master] ( github.com/uqfoundation/pathos )并运行了python setup.py安装程序,试了一下,但没有成功。然后我从我的网站包中删除了多进程(以及pathos),重新安装了pathos的依赖项,并对pathos进行了清洁安装。 还是不行。
RHam
If I try to run with regular multiprocessing I do get a slightly different error: PicklingError: PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup builtin .instancemethod failed rather than the previous: Can't pickle <type 'function'>: attribute lookup builtin .功能失败。 我不知道这是否有帮助,但这是有区别的。
我想问的是,你能不能告诉我你是如何安装所有的依赖项以及它们的版本是什么? 例如,这个 should 工作。 >$ pip install setuptools 然后是 >$ pip install git+https://github.com/uqfoundation/pathos.git@master 。 然后你可以通过导入和查看 pathos.__version__ 来检查版本,比如说。 你还应该确保你安装到与你所使用的python相同的网站包中 -- 我知道这很明显,但我见过一些人不这样做。
python
multithreading
python-2.7
pickle
pathos
RHam
RHam
发布于 2015-10-08
2 个回答
Mike McKerns
Mike McKerns
发布于 2021-12-07
0 人赞同

看起来你缺少一个关键的依赖。 对于 pathos ,你应该使用 multiprocess ,它是 multiprocessing 的分叉,使用了 dill 的序列器。

>>> 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]
    
RHam
谢谢你@Mike McKerns。这是个奇怪的问题。我试图简单地单独导入multiprocess,但不能,因为我从subprocess.py收到了以下错误。 ImportError: cannot import name _args_from_interpreter_flags. 事实证明,我无法从subprocess模块中导入_args_from_interpreter_flags。这是因为它根本不在那里。我不知道为什么它不存在。解决办法是下载 python2.7 并简单地复制和粘贴 subprocess.py。上面的示例代码现在可以工作了。
string_is_hard
string_is_hard
发布于 2021-12-07
0 人赞同

我也有类似的错误。我把我的导入部分从。

from pathos.multiprocessing import ProcessingPool