gpt4 book ai didi

python - 酸洗错误: Can't pickle with python process pool executor

转载 作者:行者123 更新时间:2023-12-02 06:17:48 30 4
gpt4 key购买 nike

util.py

def exec_multiprocessing(self, method, args):
with concurrent.futures.ProcessPoolExecutor() as executor:
results = pool.map(method, args)
return results

克隆.py

def clone_vm(self, name, first_run, host, ip):
# clone stuff

调用.py

exec_args = [(name, first_run, host, ip) for host, ip in zip(hosts, ips)]
results = self.util.exec_multiprocessing(self.clone.clone_vm, exec_args)

上面的代码给出了酸洗错误。我发现这是因为我们正在传递实例方法。所以我们应该解开实例方法。但我无法让它发挥作用。

注意:我无法创建顶级方法来避免这种情况。我必须使用实例方法。

最佳答案

让我们从概述开始 - 为什么首先出现错误:

多处理必须要求腌制(序列化)数据以将它们沿着进程或线程传递。具体来说,pool方法本身依赖于较低级别的queue来堆叠任务并将其传递给线程/进程,而queue需要经历它的所有东西都必须是可选择的。

问题是,并非所有项目都可以选择 - list of pickables - 当尝试腌制一个不可腌制的对象时,会收到 PicklingError 异常 - 正是您的情况发生的情况,您传递了一个不可腌制的实例方法。

可以有多种解决方法(每个问题都是如此) - 对我有用的解决方案是 here by Dano - 是让 pickle 处理方法并将其注册到 copy_reg .

<小时/>

在模块 clone.py 的开头添加以下行,以使 clone_vm 可选取(执行 import copy_reg类型):

def _pickle_method(m):
if m.im_self is None:
return getattr, (m.im_class, m.im_func.func_name)
else:
return getattr, (m.im_self, m.im_func.func_name)

copy_reg.pickle(types.MethodType, _pickle_method)
<小时/>

其他有用的答案 - 作者 Alex Martelli , mrule , 作者 unutbu

关于python - 酸洗错误: Can't pickle <type 'function' > with python process pool executor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31971180/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com