首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >pathos.ProcessingPool与泡菜的相互作用

pathos.ProcessingPool与泡菜的相互作用
EN

Stack Overflow用户
提问于 2016-07-08 10:40:38
回答 1查看 454关注 0票数 2

我有一份我需要计算的计算列表。我正在使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from pathos.multiprocessing import ProcessingPool
pool = ProcessingPool(nodes=7)
values = pool.map(helperFunction, someArgs)

helperFunction确实创建了一个名为Parameters的类,它在与

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import otherModule
class Parameters(otherModule.Parameters):
    ...

到现在为止还好。helperFunction将根据Parameters对象进行一些计算,更改其一些属性,最后使用pickle存储它们。下面是进行保存的助手函数(来自不同模块)的相关摘录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pickle
import hashlib
import os
class cacheHelper():

    def __init__(self, fileName, attr=[], folder='../cache/'):
        self.folder = folder

        if len(attr) > 0:
            attr = self.attrToName(attr)
        else:
            attr = ''
        self.fileNameNaked = fileName
        self.fileName = fileName + attr

    def write(self, objects):
        with open(self.getFile(), 'wb') as output:
            for object in objects:
                pickle.dump(object, output, pickle.HIGHEST_PROTOCOL)

当它到达pickle.dump()时,它会引发一个很难调试的异常,因为调试器不会进入实际面临该异常的工作人员。因此,我在转储发生之前创建了一个断点,并手动输入了该命令。这是输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> pickle.dump(objects[0], output, pickle.HIGHEST_PROTOCOL)
Traceback (most recent call last):
  File "/usr/local/anaconda2/envs/myenv2/lib/python2.7/site-packages/IPython/core/interactiveshell.py", line 2885, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-1-4d2cbb7c63d1>", line 1, in <module>
    pickle.dump(objects[0], output, pickle.HIGHEST_PROTOCOL)
  File "/usr/local/anaconda2/envs/myenv2/lib/python2.7/pickle.py", line 1376, in dump
    Pickler(file, protocol).dump(obj)
  File "/usr/local/anaconda2/envs/myenv2/lib/python2.7/pickle.py", line 224, in dump
    self.save(obj)
  File "/usr/local/anaconda2/envs/myenv2/lib/python2.7/pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "/usr/local/anaconda2/envs/myenv2/lib/python2.7/pickle.py", line 396, in save_reduce
    save(cls)
  File "/usr/local/anaconda2/envs/myenv2/lib/python2.7/pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/local/anaconda2/envs/myenv2/lib/python2.7/site-packages/dill/dill.py", line 1203, in save_type
    StockPickler.save_global(pickler, obj)
  File "/usr/local/anaconda2/envs/myenv2/lib/python2.7/pickle.py", line 754, in save_global
    (obj, module, name))
PicklingError: Can't pickle <class '__main__.Parameters'>: it's not found as __main__.Parameters

奇怪的是,当我没有并行化时,即手动通过helperFunction循环时,就不会发生这种情况。我很确定我打开的是正确的Parameters (而不是父类)。

我知道在没有一个可重复的例子的情况下调试东西是很困难的,我不希望在这个部分有任何解决方案。也许更普遍的问题是:

当通过另一个模块使用pickle.dump()的并行化代码时,需要注意什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-08 10:56:50

直接来自Python 文档

12.1.4.什么东西可以腌制和不腌制?可以对下列类型进行腌制:

  • 无,真,假
  • 整数,浮点数,复数
  • 字符串、字节、字节数组
  • 元组、列表、集和
  • 只包含在模块顶层定义的可选对象函数的字典(使用def,而不是lambda)
  • 在模块顶层定义的内置函数
  • 在模块的顶层定义的类。
  • 这些类的实例,其__dict__或调用__getstate__()的结果是可选择的(有关详细信息,请参阅泡菜类实例一节)。

其他的都不能被腌制。在您的例子中,虽然很难说出您的代码的摘录,但我认为问题在于类Parameters不是在模块的顶层定义的,因此不能对其实例进行筛选。

使用pathos.multiprocessing (或其积极开发的叉子multiprocess)而不是内置multiprocessing的全部目的是避免使用pickle,因为后者无法转储太多的东西。pathos.multiprocessingmultiprocess使用dill而不是pickle。如果您想调试一个工作人员,可以使用跟踪

注意到,因为McKerns (multiprocess的主要贡献者)正确地注意到,有些情况即使dill也无法处理,尽管在这个问题上很难制定一些普遍的规则。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38273415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文