我使用的是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

当我运行脚本时,它运行良好。但是,当我使用cProfileprofile运行它时,出现以下错误:
_pickle.PicklingError: Can't pickle <class '__main__.UpdateMessage'>: attribute lookup __main__.UpdateMessage failed

它似乎正在试图使全类同学都发酸,但我看不出为什么会发生这种情况。我的代码没有执行此操作,没有它也可以正常工作,因此它可能是multiprocessing模块。但是,为什么需要腌制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)

最佳答案

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

'__main__.UpdateMessage'

指的是已启动模块中的UpdateMessage。

如果不使用UpdateMessage类的Module来启动另一个进程,则UpdateMessage将不可用。

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

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

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

UpdateMessage_module.main()

10-04 22:27