具有多处理功能的Python decorator失败

2024-05-15 20:39:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在一个函数上使用一个decorator,然后我将把它传递给一个多处理池。但是,代码失败,“PicklingError:Can t pickle:attribute lookup__builtin__.function failed”。我不太明白为什么这里会失败。我觉得很简单,但我找不到。下面是一个最小的“工作”示例。我认为使用functools函数就足够了。

如果我注释掉功能装饰,它的工作没有问题。我在这里有什么误会?有什么办法能使这工作吗?

编辑:在添加一个可调用的类decorator和一个函数decorator之后,结果发现函数decorator可以正常工作。可调用的类装饰器继续失败。可调用类版本是什么阻止了它被pickle的?

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)

Tags: 函数inimportselftargetforreturnmy