Pythonマルチプロセッシング・ピクル・プロトコル

私はPythonのマルチプロセッシングモジュールを使ってオブジェクトをキューに置いて、いくつかのワーカーによって処理させています。私の最初の問題は、私が働いているpickleにバインドされたインスタンスメソッドを取得することでしたが、オブジェクトが __ slots __ を使用しているという事実によって別の問題が発生しています。

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

誰でもこれに関する経験はありますか?

13
エラーメッセージを貼り付けることはできますか?
追加された 著者 ktdrv,
@eswald:同上。私は2.7.1環境を使ってこれを(無駄なく)複製しようとしていました。 :)
追加された 著者 ktdrv,
どのようなPythonやマルチプロセッシングモジュールのバージョンを使用していますか?バージョン2.7では、酸洗に HIGHEST_PROTOCOL が使用されているようです。
追加された 著者 eswald,
これは2.6.5です。
追加された 著者 zchtodd,

1 答え

マルチプロセッシングパッケージが使用するpickleプロトコルを変更できない場合は、オブジェクトの __ getstate __ および __ setstate __ を定義します。

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)
11
追加された
Googleを精練した後、私は上記の解決策に進み、 getstate および setstate メソッドを実装しました。このエピソード全体は、一般的にPythonに関する多くの新しいことを学ばせてくれました。
追加された 著者 zchtodd,