如何修复或重组这种多处理模式以避免酸洗错误?

问题描述 投票:0回答:1

另一个酸洗问题... 下面导致pickling错误。我想是和scoping什么的有关。还不确定。

我们的目标是有一个装饰器,它可以接受参数并用方法来丰富一个函数。如果最好的方法是简单地显式构造类,那么这很好,但这是为了对用户写 "内容 "的事情进行隐藏。

import concurrent.futures
import functools

class A():
    def __init__(self, fun, **kwargs):
        self.fun = fun
        self.stuff = kwargs
        functools.update_wrapper(self, fun)
    def __call__(self, *args, **kwargs):
        print(self.stuff, args, kwargs)
        return self.fun(*args, **kwargs)

def decorator(**kwargs):
    def inner(fun):
        return A(fun, **kwargs)
    return inner

@decorator(a=1, b=2)
def f():
    print('f called')

executor = concurrent.futures.ProcessPoolExecutor(max_workers=10)

tasks = [f for x in range(10)]
fut = list()
for task in tasks:
    fut.append(executor.submit(task))
res = [x.result() for x in fut]
print(res)

错误的是。

_pickle.PicklingError: Can't pickle <function f at 0x7fe37da121e0>: it's not the same object as __main__.f
python pickle concurrent.futures
1个回答
1
投票

我最后做了这样的事情。

def dill_wrapped(dilled, *args, **kwargs):
    fun = dill.loads(dilled)
    return wrapped(fun, *args, **kwargs)

你可能应该尽量避免这样做 但有时在装饰函数时确实需要这样做。

© www.soinside.com 2019 - 2024. All rights reserved.