2013-01-22 45 views
6

में चर के रूप में स्वीकार करता है हाय मैं सुबह के बेहतर हिस्से के लिए इसके साथ संघर्ष कर रहा हूं और उम्मीद कर रहा था कि कोई मुझे सही दिशा में इंगित कर सकता है।एक फ़ंक्शन पास करना जो क्लास सदस्य कार्यों को पाइथन मल्टीप्रोसेस पूल.मैप()

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 

किसी भी मदद की बहुत सराहना की जाएगी

इस कोड मैं इस समय है।

उत्तर

8

multiprocess मॉड्यूल तर्क समारोह (f) है, जो किसी अन्य प्रक्रिया में निष्पादित किया जाता है के लिए पारित क्रमानुसार करने pickle मॉड्यूल का उपयोग करता है।

कई अंतर्निर्मित प्रकारों को मसाला जा सकता है, लेकिन उदाहरण विधियों को नहीं चुना जा सकता है। तो .05 ठीक है, लेकिन x.some_func1 नहीं है। अधिक जानकारी के लिए What can be pickled and unpickled? देखें।

कोई आसान समाधान नहीं है। आपको अपने प्रोग्राम को पुन: व्यवस्थित करने की आवश्यकता होगी, इसलिए उदाहरण विधियों को तर्क के रूप में पारित करने की आवश्यकता नहीं है (या multiprocess का उपयोग करने से बचें)।

+0

धन्यवाद आपके सुझाव और पुनर्गठित – ast4

3

यदि आप का कांटा pathos.multiprocesssing कहते हैं, तो आप मल्टीप्रोसेसिंग के map फ़ंक्शंस में सीधे कक्षाओं और कक्षा विधियों का उपयोग कर सकते हैं। ऐसा इसलिए है क्योंकि dill का उपयोग pickle या cPickle के बजाय किया जाता है, और dill पाइथन में लगभग कुछ भी क्रमबद्ध कर सकता है।

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