![]() |
捣蛋的上铺 · デジモンフロンティア - ...· 5 天前 · |
![]() |
威武的蜡烛 · 少林英雄- 全集在线观看– 综艺- 爱奇艺全网影视· 8 月前 · |
![]() |
孤独的足球 · 猫藓图片大全- 搜狗图片搜索· 1 年前 · |
![]() |
严肃的机器人 · 周书_ 基金经理档案_ 天天基金网· 1 年前 · |
![]() |
绅士的皮蛋 · 开始使用Adjust iOS SDK | ...· 1 年前 · |
我正在尝试使用
multiprocessing
的
Pool.map()
函数来同时划分工作。当我使用以下代码时,它工作得很好:
import multiprocessing
def f(x):
return x*x
def go():
pool = multiprocessing.Pool(processes=4)
print pool.map(f, range(10))
if __name__== '__main__' :
go()
但是,当我在更面向对象的方法中使用它时,它就不起作用了。它给出的错误消息是:
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup
__builtin__.instancemethod failed
当下面是我的主程序时,就会发生这种情况:
import someClass
if __name__== '__main__' :
sc = someClass.someClass()
sc.go()
下面是我的
someClass
类:
import multiprocessing
class someClass(object):
def __init__(self):
def f(self, x):
return x*x
def go(self):
pool = multiprocessing.Pool(processes=4)
print pool.map(self.f, range(10))
有谁知道这个问题是什么,或者是一个简单的解决方法?
发布于 2009-11-30 06:16:15
问题是多进程必须要在进程间进行访问,而绑定的方法是不可访问的。解决方法(无论您是否认为它“容易”;-)是将基础结构添加到您的程序中,以允许对此类方法进行酸洗,并将其注册到 copy_reg 标准库方法中。
例如,Steven Bethard对
this thread
的贡献(接近线程的末尾)展示了一种完全可行的方法,它允许通过
copy_reg
进行方法酸化/取消酸化。
发布于 2014-01-25 09:11:46
所有这些解决方案都很丑陋,因为除非您跳出标准库,否则多处理和酸洗都会受到破坏和限制。
如果您使用一个名为
pathos.multiprocesssing
的
multiprocessing
分支,则可以直接在多处理的
map
函数中使用类和类方法。这是因为使用了
dill
而不是
pickle
或
cPickle
,而且
dill
几乎可以序列化python中的任何内容。
pathos.multiprocessing
还提供了异步映射函数…它还可以使用多个参数(例如
map(math.pow, [1,2,3], [4,5,6])
)
map
函数
请参阅: What can multiprocessing and dill do together?
和: http://matthewrocklin.com/blog/work/2013/12/05/Parallelism-and-Serialization/
>>> import pathos.pools as pp
>>> p = pp.ProcessPool(4)
>>> def add(x,y):
... return x+y
>>> x = [0,1,2,3]
>>> y = [4,5,6,7]
>>> p.map(add, x, y)
[4, 6, 8, 10]
>>> class Test(object):
... def plus(self, x, y):
... return x+y
>>> t = Test()
>>> p.map(Test.plus, [t]*4, x, y)
[4, 6, 8, 10]
>>> p.map(t.plus, x, y)
[4, 6, 8, 10]
明确地说,你可以在第一时间做你想做的事情,如果你想做的话,你可以从解释器做。
>>> import pathos.pools as pp
>>> class someClass(object):
... def __init__(self):
... pass
... def f(self, x):
... return x*x
... def go(self):
... pool = pp.ProcessPool(4)
![]() |
威武的蜡烛 · 少林英雄- 全集在线观看– 综艺- 爱奇艺全网影视 8 月前 |
![]() |
孤独的足球 · 猫藓图片大全- 搜狗图片搜索 1 年前 |
![]() |
严肃的机器人 · 周书_ 基金经理档案_ 天天基金网 1 年前 |