マルチプロセッシングプールに渡す関数にデコレータを使用したいと思います。しかし、コードは "PicklingError:pickle:属性参照__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
はい、そのページも見つかりました。だから私は 'functools'ラッパーを追加しました。しかし、それは何の違いもないようです。私は本当に何が起こっているのか理解できていないことを告白します。 – agarrett