2011-10-27 27 views
13

私は、Pythonマルチプロセッシング・モジュールを使用してオブジェクトをキューに配置し、複数の作業者が処理させるようにしています。私の最初の問題は、私が働いていたピクルにバインドされたインスタンスメソッドを取得していたが、オブジェクトが__slots__を使用しているという事実によって別の問題が発生している。Pythonマルチプロセッシング・ピクル・プロトコル

mpモジュールがオブジェクトをpickleにすると、それは__slots__を処理できない古いascii pickleプロトコルを使用しているようです。より新しいプロトコルがこれを処理しますが、私はmpモジュールにこのプロトコルを使用させる方法がわかりません。

誰もがこれに関する経験がありますか?それは、あなたのオブジェクトに対して__getstate____setstate__を定義し、マルチプロセッシングパッケージが使用する漬物のプロトコルを変更することはできません場合は

+0

エラーメッセージを貼り付けることはできますか? – ktdrv

+6

使用しているPythonおよび/またはマルチプロセッシングモジュールのバージョンは?バージョン2.7は酸洗いに 'HIGHEST_PROTOCOL'を使うようです。 – eswald

+0

@eswald:同上。私は2.7.1環境を使ってこれを(無駄なく)複製しようとしていました。 :) – ktdrv

答えて

10

import pickle 

class Foo(object): 
    __slots__ = ['this', 'that', 'other'] 

    def __init__(self): 
     self.this = 1 
     self.that = 2 
     self.other = 3 

    def __getstate__(self): 
     return dict((name, getattr(self, name)) 
        for name in self.__slots__) 

    def __setstate__(self, state): 
     for name, value in state.items(): 
      setattr(self, name, value) 

pickle.dumps(Foo(), protocol=0) 
+0

Googleを精練した後、私は__getstate__と__setstate__メソッドを実装して、上記の解決策に行きました。このエピソード全体は、一般的にPythonに関する多くの新しいことを学ばせてくれました。 – zchtodd

関連する問題