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