Python multiprocessing PicklingError: Can't pickle &l

本文讲述了, "Can't"的应对举措, 对于众人解决难题存有一定的参考意义, 有需求的友人们, 接下来跟着小编一同去学习吧!

问题描述

限时送账号..

万分遗憾, 以更为简易的示例去重现那个错误, 我实在做不到, 而且我的代码繁杂到难以发布。要是我在shell里运行程序, 而非常规的那种环境下运行, 所有状况都会顺畅开展。

我查找了跟这个问题相关的一些以往的注释, 它们全都是因运用池调用类函数里所定义的函数导致的, 然而对我来讲并非如此。

python 复制代码
Exception in thread Thread-3:
Traceback (most recent call last):
  File "/usr/lib64/python2.7/threading.py", line 552, in __bootstrap_inner
    self.run()
  File "/usr/lib64/python2.7/threading.py", line 505, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib64/python2.7/multiprocessing/pool.py", line 313, in _handle_tasks
    put(task)
PicklingError: Can't pickle : attribute lookup __builtin__.function failed

如果有任何帮助,我将不胜感激.

I would any help.

更新 , 我的函数定义处于模块的顶层。纵然它调用了一个有着嵌套函数的函数 , 也就是说 , f() 调用 g() , 而 g() 调用有着嵌套函数 i() 的 h() , 我正在调用 pool.(f) , f() 、g() 、h() 皆是在顶层定义的。我运用这种模式尝试了更为简单的例子 , 但它的确是有效的。

推荐答案

这一片存在着一个能够用于腌制的内容清单, 尤其是, 唯有于模块的最顶层所定义的函数才是能够被挑选出来的。

这段代码:

python 复制代码
import multiprocessing as mp
class Foo():
    @staticmethod
    def work(self):
        pass
if __name__ == '__main__':   
    pool = mp.Pool()
    foo = Foo()
    pool.apply_async(foo.work)
    pool.close()
    pool.join()

_python multiprocessing_PicklingError in Python multiprocessing with nested functions"/>

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

an error to the one you :

python 复制代码
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 : attribute lookup __builtin__.function failed

问题在于, pool方法借助mp.把任务交付给工作进程。经由mp.的一切都必定是可挑选的, 然而foo.work是不可挑选的, 原因是它未在模块顶层进行定义。

能够借助于在最顶上一层定义一个函数从而将其修复, 那个函数会去调用foo的work()方法。

python 复制代码
def work(foo):
    foo.work()
pool.apply_async(work,args=(foo,))

留意, foo 这种情况是能够被挑选的, 鉴于 Foo 是于顶层进行定义的缘故, 并且 foo. 同样是能够被挑选的。

那个foo之所以是这样, 是因为Foo处于顶级层面, 而foo.是这样的标点符号。

关于"Can't"的这篇文章, 结束此次介绍啦。期望, 我们推荐出来的答案, 能给大家带去帮助。并且, 祝愿大家, 能够对html5模板网, 给予诸多支持~

相关推荐
“AI国潮设计-小江”6 小时前
《Python+SDXL实战:用ControlNet精准控制“英歌舞翻糖吐司”构图,附批量生成脚本》
开发语言·人工智能·python·prompt·aigc
wenwen_chao7 小时前
Python学习与开发资源合集:实用技巧与工具推荐
python
for_ever_love__8 小时前
函数——参数、lambda、*args与作用域
python·函数·大模型开发·编程基础
东莞市云毅网络有限公司8 小时前
企业资料时效性判定:Last-Modified、正文日期与版本字段三路交叉
python·sqlite·自动化运维·geo·数据监测
Query*8 小时前
深入浅出LangGraph【一】_基础篇
python·ai·langchain
XiaoMaqqqq8 小时前
市面上正规的IP驱动产业新场景新工具哪家强
运维·python·网络协议·tcp/ip
ShyanZh9 小时前
【Python3基础】19-Socket 与 TCP、UDP 编程
python·网络协议·tcp/ip·udp
惊讶的猫10 小时前
工具选对之后还不够:商城 Agent 的参数与权限治理
开发语言·python
天赐范式10 小时前
天赐范式第186天:让方差开始自洽——Bulmer效应的闭式验证
python·数字生命·天赐范式·动态运行时·遗传方差·bulmer效应
泡茶喝茶写代码10 小时前
A股量化数据工程:从 REST 接口到策略信号(第 8 篇):成长能力因子:营收与利润增速
java·python·股票数据api·股票数据api接口·股票量化数据api·股票量化数据接口·股票数据api数据