Загадочная ошибка pickle при профилировании скрипта Python с несколькими -процессами

Я использую модуль 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

Когда я запускаю скрипт, он работает отлично. Однако, когда я запускаю его с cProfileили profile, он выдает следующую ошибку:

_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)
6
задан Eric Yu 16 July 2012 в 21:00
поделиться