栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python多处理PicklingError:无法pickle

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python多处理PicklingError:无法pickle

这是一份可以腌制的东西的清单。特别是,函数只有在模块的顶层定义时才是可选择的。
这段代码:

import multiprocessing as mpclass Foo():    @staticmethod    def work(self):        passif __name__ == '__main__':       pool = mp.Pool()    foo = Foo()    pool.apply_async(foo.work)    pool.close()    pool.join()

产生的错误几乎与你发布的错误相同:

Exception in thread Thread-2:Traceback (most recent call last):  File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner    self.run()  File "/usr/lib/python2.7/threading.py", line 505, in run    self.__target(*self.__args, **self.__kwargs)  File "/usr/lib/python2.7/multiprocessing/pool.py", line 315, in _handle_tasks    put(task)PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed

问题在于,

pool
所有方法都使用
a mp.SimpleQueue
将任务传递给工作进程。
mp.SimpleQueue
必须经过的所有内容都必须是可选取的,并且foo.work不可选取,因为它不是在模块的顶层定义的。

可以通过在顶层定义一个函数来修复该问题,该函数调用

foo.work()

def work(foo):    foo.work()pool.apply_async(work,args=(foo,))

请注意,它foo是可拾取的,因为它Foo是在顶层定义的并且

foo.__dict__
是可拾取的。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/413569.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号