Почему многопроцессорный модуль может выбирать функции, которые вызывают анонимные функции? - PullRequest
0 голосов
/ 24 мая 2018

Я писал код (работающий на 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, он должен столкнуться с подзадачей операции засолки и выдать какую-то ошибку.Есть ли что-то, что я неправильно понимаю здесь?И есть ли какие-либо проблемы с простым обёртыванием анонимной функции в неанонимную?

1 Ответ

0 голосов
/ 24 мая 2018

wrapped_operation является нормальной именованной функцией.Вызов к нему может быть передан от родительского к дочернему процессу.

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

...