我想在隨後傳遞給多處理池的函數上使用裝飾器。但是,代碼失敗,出現「PicklingError:Can not pickle:attribute lookup __builtin__
.function failed」。我不太明白爲什麼它在這裏失敗。我確信這很簡單,但我找不到它。以下是一個最小的「工作」示例。我認爲使用functools
函數足以讓這個工作。具有多處理失敗的Python裝飾器
如果我註釋掉函數裝飾,它的工作沒有問題。 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)
這篇文章似乎表明,酸洗裝飾對象是棘手的:http://gael-varoquaux.info/blog/?p = 120 – Daenyth 2012-02-17 23:03:55
是的,我也找到了那個頁面。這就是爲什麼我添加了functools包裝器的原因。但它似乎沒有任何區別。我承認我並不真正瞭解下面發生的事情,看看它爲什麼會失敗。 – agarrett 2012-02-17 23:07:13