Когда я выполняю что-то как:
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
Я видел сообщение от Alex Martelli, имеющего дело с тем же видом проблемы, но это не было достаточно явно.
Функции, определенные в классах (даже внутри функций внутри классов), не т действительно рассол. Однако это работает:
def f(x):
return x*x
class calculate(object):
def run(self):
p = Pool()
return p.map(f, [1,2,3])
cl = calculate()
print cl.run()
Насколько мне известно, в настоящее время нет решения вашей проблемы: функция, которую вы передаете map ()
, должна быть доступна через импорт вашего модуля. Вот почему работает код Роберта: функцию f ()
можно получить, импортировав следующий код:
def f(x):
return x*x
class Calculate(object):
def run(self):
p = Pool()
return p.map(f, [1,2,3])
if __name__ == '__main__':
cl = Calculate()
print cl.run()
Я фактически добавил «основной» раздел, потому что он соответствует рекомендациям для Windows платформа («Убедитесь, что основной модуль может быть безопасно импортирован новым интерпретатором Python, не вызывая нежелательных побочных эффектов»).
Я также добавил заглавную букву перед Вычислить
, чтобы следовать PEP 8 . :)