Коли я запускаю щось на кшталт:
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екземпляр, а потім 2) передачі екземпляра цього об'єкта функції до методу Pools map. Немає?
multiprocessingмодуля зумовлені його метою бути кросплатформою, а також відсутністю fork(2)подібного системного виклику в Windows. Якщо ви не переймаєтесь підтримкою Win32, можливо, існує більш просте рішення на основі процесу. Або , якщо ви готові використовувати потоки замість процесів, ви можете замінити from multiprocessing import Poolз from multiprocessing.pool import ThreadPool as Pool.