7

嗨,我早上大部分时间都在为此苦苦挣扎,希望有人能指出我正确的方向。

这是我目前的代码:

def f(tup):
    return some_complex_function(*tup)

def main():

    pool = Pool(processes=4) 
    #import and process data omitted 
    _args = [(x.some_func1, .05, x.some_func2) for x in list_of_some_class]
    results = pool.map(f, _args)
    print results

我得到的第一个错误是:

> Exception in thread Thread-2: Traceback (most recent call last):  
> File "/usr/lib/python2.7/threading.py", line 551, in __bootstrap_inner
>     self.run()   File "/usr/lib/python2.7/threading.py", line 504, in run
>     self.__target(*self.__args, **self.__kwargs)   File "/usr/lib/python2.7/multiprocessing/pool.py", line 319, in
> _handle_tasks
>     put(task) PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed

任何帮助将不胜感激。

4

2 回答 2

9

multiprocess模块使用模块pickle序列化传递给函数 ( f) 的参数,该函数在另一个进程中执行。

许多内置类型可以腌制,但实例方法不能腌制。所以.05很好,但x.some_func1不是。请参阅可以腌制和取消腌制什么?更多细节。

没有简单的解决方案。您需要重组程序,以便不需要将实例方法作为参数传递(或避免使用multiprocess)。

于 2013-01-22T17:57:18.977 回答
3

multiprocessing如果你使用被调用的分支pathos.multiprocesssing,你可以直接在多处理的map函数中使用类和类方法。这是因为dillis 用来代替pickleor cPickle,并且dill可以在 python 中序列化几乎任何东西。

pathos.multiprocessing还提供了一个异步映射函数……它可以map使用多个参数(例如map(math.pow, [1,2,3], [4,5,6])

请参阅: 多处理和莳萝可以一起做什么?

和: http: //matthewrocklin.com/blog/work/2013/12/05/Parallelism-and-Serialization/

>>> from pathos.multiprocessing import ProcessingPool as Pool
>>> 
>>> p = Pool(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]

在此处获取代码: https ://github.com/uqfoundation/pathos

于 2014-01-25T01:17:32.233 回答