gpt4 book ai didi

Python:(悲情)多处理与类方法

转载 作者:行者123 更新时间:2023-11-28 16:33:49 26 4
gpt4 key购买 nike

我正在尝试通过多处理使用类方法并行化代码。基本结构如下:

# from multiprocessing import Pool
from pathos.multiprocessing import ProcessingPool as Pool

class myclass(object):
def __init__(self):
#some code
def mymethod(self):
#more code
return another_instance_of_myclass



def myfunc(myinstance,args):
#some code
test=myinstance.mymethod()
#more code
return myresult #not an instance,just a number

p=Pool()

result = p.map(myfunc,listwithdata)

在正常的多处理失败后,我意识到 Pickle 和多处理的问题,所以我尝试用 multiprocessing.pathos 解决它。然而,我还是得到了

PicklingError: Can't pickle <type 'SwigPyObject'>: it's not found as__builtin__.SwigPyObjec

连同来自 pickle.py 的大量错误。除了这个实际问题,我不太明白为什么除了 myfunc 的最终结果之外的任何东西都被 pickle 。

最佳答案

pathos 使用 dilldill 序列化类的方式与 python 的 pickle 模块不同。 pickle 通过引用序列化类。 dill(默认情况下)直接序列化类,并且仅可选地通过引用进行序列化。

>>> import dill
>>>
>>> class Foo(object):
... def __init__(self, x):
... self.x = x
... def bar(self, y):
... return self.x + y * z
... z = 1
...
>>> f = Foo(2)
>>>
>>> dill.dumps(f) # the dill default, explicitly serialize a class
'\x80\x02cdill.dill\n_create_type\nq\x00(cdill.dill\n_load_type\nq\x01U\x08TypeTypeq\x02\x85q\x03Rq\x04U\x03Fooq\x05h\x01U\nObjectTypeq\x06\x85q\x07Rq\x08\x85q\t}q\n(U\r__slotnames__q\x0b]q\x0cU\n__module__q\rU\x08__main__q\x0eU\x03barq\x0fcdill.dill\n_create_function\nq\x10(cdill.dill\n_unmarshal\nq\x11Uyc\x02\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00C\x00\x00\x00s\x0f\x00\x00\x00|\x00\x00j\x00\x00|\x01\x00t\x01\x00\x14\x17S(\x01\x00\x00\x00N(\x02\x00\x00\x00t\x01\x00\x00\x00xt\x01\x00\x00\x00z(\x02\x00\x00\x00t\x04\x00\x00\x00selft\x01\x00\x00\x00y(\x00\x00\x00\x00(\x00\x00\x00\x00s\x07\x00\x00\x00<stdin>t\x03\x00\x00\x00bar\x04\x00\x00\x00s\x02\x00\x00\x00\x00\x01q\x12\x85q\x13Rq\x14c__builtin__\n__main__\nh\x0fNN}q\x15tq\x16Rq\x17U\x01zq\x18K\x01U\x07__doc__q\x19NU\x08__init__q\x1ah\x10(h\x11Uuc\x02\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00C\x00\x00\x00s\r\x00\x00\x00|\x01\x00|\x00\x00_\x00\x00d\x00\x00S(\x01\x00\x00\x00N(\x01\x00\x00\x00t\x01\x00\x00\x00x(\x02\x00\x00\x00t\x04\x00\x00\x00selfR\x00\x00\x00\x00(\x00\x00\x00\x00(\x00\x00\x00\x00s\x07\x00\x00\x00<stdin>t\x08\x00\x00\x00__init__\x02\x00\x00\x00s\x02\x00\x00\x00\x00\x01q\x1b\x85q\x1cRq\x1dc__builtin__\n__main__\nh\x1aNN}q\x1etq\x1fRq utq!Rq")\x81q#}q$U\x01xq%K\x02sb.'
>>> dill.dumps(f, byref=True) # the pickle default, serialize by reference
'\x80\x02c__main__\nFoo\nq\x00)\x81q\x01}q\x02U\x01xq\x03K\x02sb.'

不按引用序列化要灵活得多。但是,在极少数情况下,使用引用会更好(因为在 pickle 构建在 SwigPyObject 上的东西时似乎就是这种情况)。

我一直想(大约 2 年)将 byref 标志暴露给 pathos 中的 dump 调用,但还没有这样做了。这样做应该是一个相当简单的编辑。我刚刚添加了一张票:https://github.com/uqfoundation/pathos/issues/58 .当我在做的时候,打开 pathos 使用的 dumpload 函数的替换应该也很容易......这样你可以使用自定义序列化器(即扩展 dill 提供的序列化器,或使用其他序列化器)。

关于Python:(悲情)多处理与类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29121979/

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