PicklingError: Can#39;t pickle lt;type #39;function#39;gt; with python process pool executor(PicklingError:Can#39;t Picklelt;TYPE#39;Function39;;;With Python Process Pool Executor:Can#39;t Picklelt;type#39;Function39;;With Pickling Process Pool Executor)
问题描述
util.py
def exec_multiprocessing(self, method, args):
    with concurrent.futures.ProcessPoolExecutor() as executor:
        results = pool.map(method, args)
        return results
clone.py
def clone_vm(self, name, first_run, host, ip):
    # clone stuff
invoke.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)
上面的代码给出了酸洗错误。我发现这是因为我们正在传递实例方法。因此,我们应该解开实例方法。但我无法使其工作。
注意:我无法创建顶级方法来避免这种情况。我必须使用实例方法。
推荐答案
让我们从概述开始-为什么首先出现错误:
multiprocessing必须要求对数据进行PICLE(序列化),才能将它们沿着进程或线程传递。具体地说,pool方法本身依赖于较低级别的queue堆栈任务并将它们传递给线程/进程,queue要求通过它的所有内容都必须是可拾取的。
问题是,并不是所有项都是可拾取的-list of pickables-当您尝试拾取不可拾取的对象时,会得到PicklingError异常-与您的情况完全相同,您传递了一个不可拾取的实例方法。
可以有各种解决方法(每个问题都是这样)--对我有效的解决方案是here by Dano--让pickle处理方法并将其注册到copy_reg。
在模块的开头clone.py添加以使clone_vm可拾取(执行importcopy_reg和types):
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
这篇关于PicklingError:Can';t Pickle<;TYPE';Function&39;;&>;With Python Process Pool Executor:Can';t Pickle<;type';Function&39;&>;With Pickling Process Pool Executor的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:PicklingError:Can';t Pickle<;TYPE';Function&39;;&>;With Python Process Pool Executor:Can';t Pickle<;type';Function&39;&
				
        
 
            
        基础教程推荐
- PANDA VALUE_COUNTS包含GROUP BY之前的所有值 2022-01-01
 - 包装空间模型 2022-01-01
 - 修改列表中的数据帧不起作用 2022-01-01
 - PermissionError: pip 从 8.1.1 升级到 8.1.2 2022-01-01
 - 在同一图形上绘制Bokeh的烛台和音量条 2022-01-01
 - 求两个直方图的卷积 2022-01-01
 - 无法导入 Pytorch [WinError 126] 找不到指定的模块 2022-01-01
 - Plotly:如何设置绘图图形的样式,使其不显示缺失日期的间隙? 2022-01-01
 - 在Python中从Azure BLOB存储中读取文件 2022-01-01
 - 使用大型矩阵时禁止 Pycharm 输出中的自动换行符 2022-01-01
 
    	
    	
    	
    	
    	
    	
    	
    	
				
				
				
				