6

multiprocessing正在使用模块,并且正在使用UpdateMessage通过对象发送的对象(我自己的类)multiprocessing.Queue在进程之间进行通信。这是类:

class UpdateMessage:
    def __init__(self, arrayref, rowslice, colslice, newval):
        self.arrayref = arrayref
        self.rowslice = rowslice
        self.colslice = colslice
        self.newval = newval
    def do_update(self):
        if self.arrayref == 'uL':
            arr = uL
        elif self.arrayref == 'uR':
            arr = uR
        else:
            raise Exception('UpdateMessage.arrayref neither uL nor uR')
        arr[self.rowslice, self.colslice] = self.newval

当我运行脚本时,它工作得很好。但是,当我使用cProfileor运行它时profile,会出现以下错误:

_pickle.PicklingError: Can't pickle <class '__main__.UpdateMessage'>: attribute lookup __main__.UpdateMessage failed

它似乎试图腌制课程,但我不明白为什么会这样。我的代码没有这样做,没有它也可以正常工作,所以它可能是multiprocessing模块。但是为什么需要 pickle UpdateMessage,我该如何解决这个错误?

编辑:这是发送的代码的一部分UpdateMessage(脚本的多个部分执行此操作,但都以相同的方式):

msg = UpdateMessage(uLref, refer[0] + marker[0] - 2,
                    slice(uL.shape[1]), ustar.copy())
queue.put(msg)

回溯不是很有帮助:

Traceback (most recent call last):
  File "/usr/lib/python3.2/multiprocessing/queues.py", line 272, in _feed
    send(obj)
4

3 回答 3

5

我不知道您的流程如何,但是:

'__main__.UpdateMessage'

指已启动模块中的 UpdateMessage。

当另一个进程不使用类的 Module 启动时UpdateMessage,UpdateMessage 将不可用。

您必须导入包含 UpdateMessage 的模块 UpdateMessage.__module__ is not '__main__'

然后Pickle 也可以在其他程序中找到UpdateMessage。

我建议__main__.py看起来像这样:

import UpdateMessage_module

UpdateMessage_module.main()
于 2012-07-16T22:32:53.703 回答
4

我有同样的问题,并通过在自己的文件中定义要腌制的类来解决它。

于 2014-05-02T08:16:38.017 回答
0

我假设在您的课程被发送到另一个进程之前,您的课程正在发生酸洗尝试。最简单的解决方案可能只是在你的类上显式地实现泡菜协议......

于 2012-07-16T21:43:05.787 回答