Я писал код (работающий на Mac), который зависел от составления длинного списка функций и применения результирующей функции к списку с помощью многопроцессорной обработки.Если я запускаю следующий код, я получаю AttributeError
, потому что модуль multiprocessing
должен выбрать функцию и не может выбрать анонимные функции.
import multiprocessing
import functools
def compose(*functions):
return functools.reduce(lambda f, g: lambda x: f(g(x)), functions, lambda x: x
twox = lambda x: 2*x
funcs = [twox, twox, twox]
operation = compose(*funcs)
nums = range(10)
p = multiprocessing.Pool(processes=3)
p.map(operation, nums) ## raises an AttributeError
Я понимаю, почему этот код не работает.Что удивительно, так это то, что если я вместо этого создаю функцию, которая просто вызывает операцию, все работает нормально.Другими словами, следующий код возвращает правильный результат:
def wrapped_operation(x):
return operation(x)
p = multiprocessing.Pool(processes=3)
p.map(wrapped_operation, nums) ## returns [0,8,16,...]
Почему это так?Мне кажется, что если Python нужно засолить wrapped_operation, он должен столкнуться с подзадачей операции засолки и выдать какую-то ошибку.Есть ли что-то, что я неправильно понимаю здесь?И есть ли какие-либо проблемы с простым обёртыванием анонимной функции в неанонимную?