যখন আমি এই জাতীয় কিছু চালাই:
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বাছাইযোগ্য, সুতরাং দেখে মনে হচ্ছে এটি 1) এর মাধ্যমে সমাধান করা যেতে পারে এমন কোনও কনস্ট্রাক্টরের সাথে একটি ফাংশন অবজেক্ট তৈরি করে যা কোনও calculateউদাহরণে অনুলিপি করে এবং তারপরে ২) এই ফাংশনটির কোনও উদাহরণকে Poolএর mapপদ্ধতিতে পাস করে । কোন?
multiprocessingমডিউলটির কিছু সীমাবদ্ধতা ক্রস-প্ল্যাটফর্মের বাস্তবায়ন হওয়ার লক্ষ্য fork(2)এবং উইন্ডোজটিতে একটি- মত সিস্টেম কলের অভাবের কারণে । আপনি যদি উইন 32 সমর্থন সম্পর্কে চিন্তা না করেন তবে একটি সহজ প্রক্রিয়া-ভিত্তিক কর্মক্ষেত্র হতে পারে। অথবা আপনি কি প্রক্রিয়ার পরিবর্তে থ্রেড ব্যবহার করার জন্য প্রস্তুত করছি, আপনি প্রতিস্থাপন করতে পারেন from multiprocessing import Poolসঙ্গে from multiprocessing.pool import ThreadPool as Pool।