2017-07-15 5 views
1

Python multiprocessingライブラリで使用されるシリアライズ方法を変更するにはどうすればよいですか?特に、デフォルトのシリアライゼーション方法では、そのバージョンのPythonにデフォルトのpickleプロトコルバージョンを持つpickleライブラリを使用します。デフォルトのpickleプロトコルは、Python 2.7ではバージョン2、Python 3.6ではバージョン3です。 Python 3.6でプロトコルのバージョンを2に設定するにはどうすればいいですか?multiprocessingライブラリのいくつかのクラス(ClientListenerなど)を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で実行されているサーバーに表示されています。

答えて

2

マルチプロセッシング"context" objectを使用している場合は、あなたが参照しているパッチがうまく動作すると思います。

import pickle2reducer 
import multiprocessing as mp 

ctx = mp.get_context() 
ctx.reducer = pickle2reducer.Pickle2Reducer() 

そしてctxmultiprocessingと同じAPIを持っていますと

あなたpickle2reducer.pyを使用して、あなたのクライアントが起動する必要があります。

希望に役立ちます!

+0

これは、パッチを利用する正しい方法のようです。私は特定の状況でコンテキストを使用する方法を見ません。私は 'from multiprocessing.connection import Client、Listener'と' from multiprocessing.managers import BaseManager、NameSpaceProxy'を使い、これらの4つのクラスのどれもコンテキストオブジェクトからアクセスできません。私は代わりにこれを行うことができました: 'multiprocessing.context._default_context.reducer = Pickle2Reducer()'。 –

関連する問題