2017-07-15 106 views
1

如何更改Python multiprocessing庫使用的序列化方法?特別是,默認序列化方法使用pickle庫和該版本的Python的默認pickle協議版本。默認的pickle協議是Python 2.7中的版本2和Python 3.6中的版本3。如何在Python 3.6中將協議版本設置爲2,以便我可以使用multiprocessing庫中的某些類(如ClientListener)在Python 2.7運行的服務器處理和Python 3.6運行的客戶端進程之間進行通信?如何更改Python多處理使用的序列化方法?

(附註:作爲一個測試,我加入protocol=2dump()調用強制協議版本2和我的客戶機/服務器進程在我有限的測試工作由2.7上運行的服務器和客戶端通過修改line 206 of multiprocessing/connection.py 3.6)。

在Python 3.6中,合併patch以設置序列化程序,但該修補程序沒有記錄,並且我還沒有弄清楚如何使用它。這裏是我試圖用它(我張貼這也給Python的票,我掛):

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() 

在與multiprocessing做任何事情之前在頂部。當我這樣做時,我仍然在由Python 2.7運行的服務器上看到ValueError: unsupported pickle protocol: 3

回答

2

我相信你指的補丁工程如果你使用多處理"context" object

使用您pickle2reducer.py,客戶端應該開始:

import pickle2reducer 
import multiprocessing as mp 

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

而且ctx具有相同的API multiprocessing

希望有幫助!

+0

這似乎是正確的方式來使用該修補程序。我沒有看到如何在特定情況下使用上下文。我使用'from multiprocessing.connection import Client,Listener'和'from multiprocessing.managers import BaseManager,NameSpaceProxy',這四個類都不能從上下文對象訪問。我可以這樣做:'multiprocessing.context._default_context.reducer = Pickle2Reducer()'。 –

相關問題