gpt4 book ai didi

python - 如何更改多处理模块使用的序列化方法?

转载 作者:行者123 更新时间:2023-12-03 10:08:19 25 4
gpt4 key购买 nike

如何更改 Python 使用的序列化方法 multiprocessing图书馆?特别是,默认的序列化方法使用 pickle具有该 Python 版本的默认 pickle 协议(protocol)版本的库。默认的 pickle 协议(protocol)是 Python 2.7 中的版本 2 和 Python 3.6 中的版本 3。如何在 Python 3.6 中将协议(protocol)版本设置为 2,以便可以使用 Client 中的一些类(如 Listenermultiprocessing )在 Python 2.7 运行的服务器处理和 Python 3.6 运行的客户端进程之间进行通信的库?

(旁注:作为测试,我修改了 line 206 of multiprocessing/connection.py ,将 protocol=2 添加到 dump() 调用中以强制协议(protocol)版本为 2,并且我的客户端/服务器进程在我的有限测试中工作,服务器由 2.7 和客户端由 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 做任何其他事情之前在顶部.我仍然看到 ValueError: unsupported pickle protocol: 3当我这样做时,在由 Python 2.7 运行的服务器上。

最佳答案

如果您使用多处理 "context" object,我相信您所指的补丁可以工作。 .

使用您的 pickle2reducer.py,您的客户端应该从以下内容开始:

import pickle2reducer
import multiprocessing as mp

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

ctxmultiprocessing 具有相同的 API .

希望有帮助!

关于python - 如何更改多处理模块使用的序列化方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51971983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com