如何更改Python multiprocessing
庫使用的序列化方法?特別是,默認序列化方法使用pickle
庫和該版本的Python的默認pickle協議版本。默認的pickle協議是Python 2.7中的版本2和Python 3.6中的版本3。如何在Python 3.6中將協議版本設置爲2,以便我可以使用multiprocessing
庫中的某些類(如Client
和Listener
)在Python 2.7運行的服務器處理和Python 3.6運行的客戶端進程之間進行通信?如何更改Python多處理使用的序列化方法?
(附註:作爲一個測試,我加入protocol=2
到dump()
調用強制協議版本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
。
這似乎是正確的方式來使用該修補程序。我沒有看到如何在特定情況下使用上下文。我使用'from multiprocessing.connection import Client,Listener'和'from multiprocessing.managers import BaseManager,NameSpaceProxy',這四個類都不能從上下文對象訪問。我可以這樣做:'multiprocessing.context._default_context.reducer = Pickle2Reducer()'。 –