Chciałbym użyć dekoratora funkcji, którą następnie przejdę do puli wieloprocesowej. Jednak kod kończy się niepowodzeniem z opcją "PicklingError: Can not belele: attribute lookup __builtin__
. Funkcja nie powiodła się". Nie do końca rozumiem, dlaczego tutaj się nie udało. Czuję, że jest to coś prostego, ale nie mogę go znaleźć. Poniżej znajduje się minimalny "działający" przykład. Pomyślałem, że użycie funkcji functools
wystarczy, aby to zadziałało.Python decorator with multiprocessing failed
Jeśli skomentuję dekorację funkcji, działa ona bez problemu. O co chodzi z tym, że nie rozumiem tutaj? Czy jest jakiś sposób, aby to zadziałało?
Edit: Po dodaniu zarówno wpłacone klasy dekoratora i dekorator funkcji, okazuje się, że dekorator funkcja działa zgodnie z oczekiwaniami. Dekorator klasy Callable nadal kończy się niepowodzeniem. Co jest takiego w wersji klasowej, która uniemożliwia jej marynowanie?
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)
Ten post zdaje się wskazywać, że trawienie zdobionych przedmiotów jest trudne: http://gael-varoquaux.info/blog/?p = 120 – Daenyth
Tak, znalazłem również tę stronę. Dlatego dodałem opakowanie 'functools'. Ale to nie robi żadnej różnicy. Przyznaję, że tak naprawdę nie rozumiem, co dzieje się pod spodem, aby zobaczyć, dlaczego zawodzi. – agarrett