我试图通过多处理使用类方法来并行化代码。基本结构如下:
# 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和多处理的问题,所以我尝试用多处理.pathos. 但是,我仍然
^{pr2}$还有很多错误泡菜.py. 除了这个实际的问题,我不太明白为什么除了myfunc的最终结果之外,还有什么会被腌制。在
pathos
使用dill
,dill
序列化类的方式与python的{pickle
通过引用序列化类。dill
(默认情况下)直接序列化类,并且只能通过引用选择性地序列化。在不通过引用序列化要灵活得多。但是,在极少数情况下,使用引用会更好(在pickle构建在
SwigPyObject
上的东西时似乎就是这种情况)。在我一直想(2年)把
byref
标志暴露给dump
内部的dump
调用,但还没有这样做。这样做应该很简单。我刚刚添加了一张罚单来这样做:https://github.com/uqfoundation/pathos/issues/58。在我做这件事的时候,打开dump
和load
函数的替换pathos
使用这种方法,您可以使用定制的序列化程序(即扩展dill
提供的序列化程序,或者使用其他序列化程序)。在在多进程处理中,进程间通信需要串行化。Pickle在这方面做得不好,而是通过pip安装dill。详细信息(有一个不错的星际迷航的例子)可以在这里找到: http://matthewrocklin.com/blog/work/2013/12/05/Parallelism-and-Serialization/
相关问题 更多 >
编程相关推荐