Python多处理PicklingError:无法pickle

Python多处理PicklingError:无法pickle,第1张

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__
是可拾取的。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5030496.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-15
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存