2013-01-22 11 views
6

Merhaba, sabahın daha iyi bir kısmı için bununla uğraşıyordum ve birisinin beni doğru yöne çevirebileceğini umuyordum.Sınıf üyesi işlevlerini python çoklu işlem havuzuna kabul eden bir işlevi geçirme.map()

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 

alıyorum ilk hatadır:

> 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 

Herhangi bir yardım çok mutluluk duyacağız

Bu

şu anda var koddur.

cevap

8

multiprocess modülü, başka bir işlemde çalıştırılan işleve (f) aktarılan bağımsız değişkenleri serileştirmek için pickle modülünü kullanır.

Yerleşik türlerin birçoğunun bir kısmı alınabilir, ancak örnek yöntemler seçilemez. Yani .05 iyi, ancak x.some_func1 değil. Daha fazla bilgi için What can be pickled and unpickled?'a bakın.

Kolay bir çözüm yoktur. Programınızı yeniden yapılandırmanız gerekir, böylece örnek yöntemlerin argüman olarak geçilmesine gerek yoktur (veya multiprocess'u kullanmaktan kaçının).

+0

Teşekkürler önerdi ve yeniden yapılandırıldı – ast4

3

pathos.multiprocesssing adı verilen multiprocessing çatal kullanırsanız, çoklu işlemenin map işlevlerinde doğrudan sınıfları ve sınıf yöntemlerini kullanabilirsiniz. Bunun nedeni, pickle veya cPickle yerine dill'un kullanıldığı ve dill'un python'daki hemen hemen her şeyi serileştirebilmesidir.

pathos.multiprocessing da uyumsuz bir harita işlevi sağlar ... ve can birden argümanlarla map fonksiyonları (örn map(math.pow, [1,2,3], [4,5,6]))

Bkz: What can multiprocessing and dill do together?

ve: 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] 

kodu alın burada: https://github.com/uqfoundation/pathos

İlgili konular