Многопроцессорная обработка: Как использовать Pool.map на функции, определяемой в классе?

Когда я выполняю что-то как:

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, имеющего дело с тем же видом проблемы, но это не было достаточно явно.

165
задан martineau 9 May 2016 в 13:37
поделиться

2 ответа

Функции, определенные в классах (даже внутри функций внутри классов), не т действительно рассол. Однако это работает:

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()
7
ответ дан 23 November 2019 в 21:09
поделиться

Насколько мне известно, в настоящее время нет решения вашей проблемы: функция, которую вы передаете 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 . :)

39
ответ дан 23 November 2019 в 21:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: