Пример многопроцессорности, предоставляющий AttributeError

Я пытаюсь реализовать многопроцессорность в своем коде, и поэтому я подумал, что начну свое обучение с нескольких примеров. Я использовал первый пример из документации.

from multiprocessing import Pool
def f(x):
    return x*x

if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(f, [1, 2, 3]))

Когда я запускаю приведенный выше код, я получаю AttributeError: can't get attribute 'f' on <module '__main__' (built-in)>. Я не знаю, почему я получаю эту ошибку. Я также использую Python 3.5, если это помогает.

Ответ 1

Эта проблема представляет собой конструктивную особенность многопроцессорной обработки. См. https://bugs.python.org/issue25053. По какой-то причине пул не всегда работает с объектами, не определенными в импортированном модуле. Поэтому вам нужно записать свою функцию в другой файл и импортировать модуль.

Файл: defs.py

def f(x):
    return x*x

Файл: run.py

from multiprocessing import Pool
import defs

 if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(defs.f, [1, 2, 3]))

Если вы используете печать или другую встроенную функцию, этот пример должен работать. Если это не ошибка (по ссылке), данный пример выбирается плохо.