【发布时间】:2020-12-07 22:16:00
【问题描述】:
我有这个最小的例子:
from functools import wraps
from concurrent import futures
import random
def decorator(func):
num_process = 4
def impl(*args, **kwargs):
with futures.ProcessPoolExecutor() as executor:
fs = []
for i in range(num_process):
fut = executor.submit(func, *args, **kwargs)
fs.append(fut)
result = []
for f in futures.as_completed(fs):
result.append(f.result())
return result
return impl
@decorator
def get_random_int():
return random.randint(0, 100)
if __name__ == "__main__":
result = get_random_int()
print(result)
如果我们尝试运行这个函数,我想我们会遇到以下错误:
_pickle.PicklingError: Can't pickle <function get_random_int at 0x7f06cee666a8>: it's not the same object as __main__.get_random_int
我认为这里的主要问题是“包装”装饰器本身会改变 func 对象,因此无法腌制。我觉得这很奇怪。我只是想知道是否有任何方法可以解决这种行为?如果可能的话,我想使用wraps。谢谢!
【问题讨论】:
-
同意。我见过类似的问题。它抱怨酸洗。想知道是否有人有办法解决这个问题。
标签: python python-3.x pickle concurrent.futures