Я хотел бы использовать декоратор для функции, которую потом перейду в многопроцессорный пул. Тем не менее, код выходит из строя с помощью "PicklingError: Can not pickle: find lookup __builtin__
.function failed". Я не совсем понимаю, почему здесь это не удается. Я уверен, что это что-то простое, но я не могу его найти. Ниже приведен минимальный "рабочий" пример. Я думал, что использование функции functools
было бы достаточно, чтобы это сработало.
Если я прокомментирую функцию украшения, она работает без проблем. Что это за multiprocessing
, что я не понимаю здесь? Есть ли способ сделать эту работу?
Изменить: добавив как декоратор класса, вызывающий класс, так и декоратор функции, выясняется, что декоратор функции работает должным образом. Вызываемый класс-декоратор продолжает терпеть неудачу. Что это за вызываемая версия класса, которая препятствует ее маринованию?
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)