Python multiprocessing
ライブラリで使用されるシリアライズ方法を変更するにはどうすればよいですか?特に、デフォルトのシリアライゼーション方法では、そのバージョンのPythonにデフォルトのpickleプロトコルバージョンを持つpickle
ライブラリを使用します。デフォルトのpickleプロトコルは、Python 2.7ではバージョン2、Python 3.6ではバージョン3です。 Python 3.6でプロトコルのバージョンを2に設定するにはどうすればいいですか?multiprocessing
ライブラリのいくつかのクラス(Client
とListener
など)をPython 2.7で実行されるサーバー処理とPython 3.6で実行されるクライアントプロセス間で通信するために使用できますか?Pythonのマルチプロセッシングで使用されるシリアライズ方法を変更するには?
(サイドノート:テストとして、私は2にプロトコルのバージョンを強制的にdump()
コールにprotocol=2
を追加することにより、line 206 of multiprocessing/connection.py
を修正し、私のクライアント/サーバ・プロセスは、2.7で実行されるサーバーとクライアントによると私の限られたテストで働いていました3.6)。
Python 3.6では、patchがマージされてシリアライザが設定されましたが、パッチは文書化されていませんでした。使用方法はわかりません。
pickle2reducer.py:
from multiprocessing.reduction import ForkingPickler, AbstractReducer
class ForkingPickler2(ForkingPickler):
def __init__(self, *args):
if len(args) > 1:
args[1] = 2
else:
args.append(2)
super().__init__(*args)
@classmethod
def dumps(cls, obj, protocol=2):
return ForkingPickler.dumps(obj, protocol)
def dump(obj, file, protocol=2):
ForkingPickler2(file, protocol).dump(obj)
class Pickle2Reducer(AbstractReducer):
ForkingPickler = ForkingPickler2
register = ForkingPickler2.register
dump = dump
と私のクライアントで:
import pickle2reducer
multiprocessing.reducer = pickle2reducer.Pickle2Reducer()
ここで私はそれを使用しようとした方法です(私も、私がリンクされ、Pythonのチケットに投稿しました)一番上に何か他のことをする前にmultiprocessing
。これを行うと、私はまだValueError: unsupported pickle protocol: 3
がPython 2.7で実行されているサーバーに表示されています。
これは、パッチを利用する正しい方法のようです。私は特定の状況でコンテキストを使用する方法を見ません。私は 'from multiprocessing.connection import Client、Listener'と' from multiprocessing.managers import BaseManager、NameSpaceProxy'を使い、これらの4つのクラスのどれもコンテキストオブジェクトからアクセスできません。私は代わりにこれを行うことができました: 'multiprocessing.context._default_context.reducer = Pickle2Reducer()'。 –