2014-01-14 36 views
0

我在做一些Python多,使用類,而要做到這樣的事情,我不得不使用這個approach酸洗靜態方法 - Python的

def _pickle_method(method): 
    func_name = method.im_func.__name__ 
    obj = method.im_self 
    cls = method.im_class 
    if func_name.startswith('__') and not func_name.endswith('__'): #deal with mangled names 
     cls_name = cls.__name__.lstrip('_') 
     func_name = '_' + cls_name + func_name 
    print cls 
    return _unpickle_method, (func_name, obj, cls) 


def _unpickle_method(func_name, obj, cls): 
    for cls in cls.__mro__: 
     try: 
      func = cls.__dict__[func_name] 
     except KeyError: 
      pass 
     else: 
      break 
    return func.__get__(obj, cls) 

的問題是因爲我有一些靜態方法,也應該並行化。但我found與此我不能pickle靜態方法。我想知道有一種方法可以改變這種方法來做這樣的事情,所以我可以醃製非靜態和靜態方法。

預先感謝您。

+1

爲什麼你需要這種方法?你的類方法是動態生成的嗎? –

+0

這是我發現多處理類方法的唯一方法。 – pceccon

+0

爲什麼不將常規函數傳遞給池,而是在該函數中調用方法? –

回答

1

我不太確定你在做什麼......但是如果你想和類一起工作,並且multiprocessing,除非跳出標準庫,否則它會變得很難看。

如果使用名爲pathos.multiprocesssingmultiprocessing的分支,可以在多處理的map函數中直接使用類和類方法。這是因爲dill使用的picklecPickle,並dill而是可以序列化Python中幾乎所有的東西。

pathos.multiprocessing還提供了一個異步映射函數...和它可以map功能使用多個參數(例如map(math.pow, [1,2,3], [4,5,6])

參見: What can multiprocessing and dill do together?

和: 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