Me gustaría utilizar un decorador en una función que posteriormente pasaré a un grupo de multiprocesamiento. Sin embargo, el código falla con "PicklingError: Can not pickle: búsqueda de atributo __builtin__
.function failed". No entiendo por qué falla aquí. Estoy seguro de que es algo simple, pero no puedo encontrarlo. A continuación se muestra un ejemplo mínimo de "trabajo". Pensé que usar la función functools
sería suficiente para que esto funcione.El decorador de Python con multiprocesamiento falla
Si comento la decoración de la función, funciona sin problemas. ¿De qué se trata multiprocessing
que estoy malentendiendo aquí? ¿Hay alguna manera de hacer funcionar esto?
Editar: Después de añadir tanto un decorador de clase exigible y un decorador función, resulta que el decorador función funciona como se espera. El decorador de clase invocable sigue fallando. ¿De qué se trata la versión de clase invocable que evita que se escatime?
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)
Esta publicación parece indicar que la decapación de objetos decorados es complicada: http://gael-varoquaux.info/blog/?p = 120 – Daenyth
Sí, encontré esa página, también. Es por eso que agregué el contenedor 'functools'. Pero no parece hacer ninguna diferencia. Confieso que realmente no entiendo lo que está sucediendo debajo para ver por qué falla. – agarrett