Декоратор Python с многопроцессорной обработкой не работает

Я хотел бы использовать декоратор для функции, которую я впоследствии передам в пул многопроцессорной обработки. Однако код не работает с "PicklingError: Can't pickle: attribute lookup __ builtin __ .function failed". Я не совсем понимаю, почему здесь не работает. Я уверен, что это что-то простое, но я не могу его найти. Ниже приведен минимальный "рабочий" пример. Я подумал, что использования функции functools будет достаточно, чтобы это работало.

Если я закомментирую оформление функции, оно будет работать без проблем. Что это такое. о многопроцессорности , которую я здесь неправильно понимаю? Есть ли способ заставить эту работу работать?

Изменить : после добавления декоратора вызываемого класса и декоратора функции, оказывается, что декоратор функции работает должным образом . Декоратор вызываемого класса продолжает давать сбой. Это о версии вызываемого класса, которая не дает ему травиться?

import random
import multiprocessing
import functools

class my_decorator_class(object):
    def __init__(self, target):
        self.target = target
        try:
            functools.update_wrapper(self, target)
        except:
            pass

    def __call__(self, elements):
        f = []
        for element in elements:
            f.append(self.target([element])[0])
        return f

def my_decorator_function(target):
    @functools.wraps(target)
    def inner(elements):
        f = []
        for element in elements:
            f.append(target([element])[0])
        return f
    return inner

@my_decorator_function
def my_func(elements):
    f = []
    for element in elements:
        f.append(sum(element))
    return f

if __name__ == '__main__':
    elements = [[random.randint(0, 9) for _ in range(5)] for _ in range(10)]
    pool = multiprocessing.Pool(processes=4)
    results = [pool.apply_async(my_func, ([e],)) for e in elements]
    pool.close()
    f = [r.get()[0] for r in results]
    print(f)
17
задан agarrett 17 February 2012 в 23:15
поделиться