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