ben sonradan bir çoklu işlem havuzuna geçecek bir fonksiyonu üzerine bir dekoratör kullanmak istiyorum başarısız olur. Ancak, kod başarısız olur "PicklingError: turşu edilemez: nitelik arama __builtin__
.function başarısız oldu". Burada neden başarısız olduğunu anlamıyorum. Bunun basit bir şey olduğundan eminim, ama bunu bulamıyorum. Aşağıda minimal "çalışan" bir örnek. Bunun işe yaraması için functools
işlevini kullanmanın yeterli olacağını düşündüm. Ben fonksiyon dekorasyon dışarı yorum yaparsanızPython dekoratör
, bu bir sorun olmadan çalışır. Burada yanlış anlamadığım multiprocessing
hakkında nedir? Bu işi yapmanın bir yolu var mı?
Düzenleme: Bir çağrılabilir sınıf dekoratör ve bir işlev dekoratör hem ekledikten sonra, çıkıyor bu beklendiği gibi çalıştığını fonksiyon dekoratör. Kalibre sınıf dekoratör başarısız olmaya devam ediyor. Kaldırabileceğiniz sınıf versiyonu hakkında ne söyleniyor?
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)
Bu gönderi, süslemeli süslenmiş nesnelerin zor olduğunu gösteriyor: http://gael-varoquaux.info/blog/?p = 120 – Daenyth
Evet, bu sayfayı da buldum. Bu yüzden 'functools' sarıcısını ekledim. Ama hiçbir fark yaratmıyor gibi görünüyor. Bunun neden başarısız olduğunu anlamak için ne olduğunu anlamadığımı itiraf ediyorum. – agarrett