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