जब मैं कुछ चलाता हूं:
from multiprocessing import Pool
p = Pool(5)
def f(x):
return x*x
p.map(f, [1,2,3])
यह बढ़िया काम करता है। हालाँकि, इसे एक वर्ग के कार्य के रूप में रखा जाता है:
class calculate(object):
def run(self):
def f(x):
return x*x
p = Pool()
return p.map(f, [1,2,3])
cl = calculate()
print cl.run()
मुझे निम्नलिखित त्रुटि देता है:
Exception in thread Thread-1:
Traceback (most recent call last):
File "/sw/lib/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
File "/sw/lib/python2.6/threading.py", line 484, in run
self.__target(*self.__args, **self.__kwargs)
File "/sw/lib/python2.6/multiprocessing/pool.py", line 225, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
मैंने एलेक्स मार्टेली की एक पोस्ट को उसी तरह की समस्या से निपटने के लिए देखा है, लेकिन यह स्पष्ट रूप से पर्याप्त नहीं था।
IPython.Parallel
, लेकिन वहां आप ऑब्जेक्ट्स को नोड्स पर धकेलकर समस्या के आसपास पहुंच सकते हैं। मल्टीप्रोसेसिंग के साथ इस समस्या को प्राप्त करना बहुत कष्टप्रद लगता है।
calculate
, picklable है, इसलिए यह) यह 1 से हल किया जा सकता की तरह लगता है एक निर्माता है कि एक से अधिक प्रतियों के साथ एक समारोह वस्तु बनाने calculate
उदाहरण और उसके बाद 2) को यह समारोह वस्तु का एक उदाहरण से गुजर रहा Pool
है map
विधि। नहीं?
multiprocessing
मॉड्यूल की कुछ सीमाएं क्रॉस-प्लेटफॉर्म कार्यान्वयन और fork(2)
विंडोज में एक समान सिस्टम कॉल की कमी के अपने लक्ष्य के कारण हैं । यदि आप Win32 समर्थन की परवाह नहीं करते हैं, तो एक सरल प्रक्रिया-आधारित समाधान हो सकता है। या यदि आप प्रक्रियाओं के बजाय थ्रेड्स का उपयोग करने के लिए तैयार हैं, तो आप के from multiprocessing import Pool
साथ स्थानापन्न कर सकते हैं from multiprocessing.pool import ThreadPool as Pool
।