私は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
モジュールです。しかし、なぜ 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)