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模板网, 给予诸多支持~

相关推荐
云水初1 分钟前
【agent篇】RAG Agent避坑指南(附高级RAG Agent汇总)
开发语言·笔记·python·学习·langchain·agent·rag
薛定猫AI7 分钟前
【技术干货】多AI团队大模型协作编排与编程项目评测架构解析
python·机器学习·ai·大模型·技术实战
外收内放8 分钟前
数据分析(图表信息详解)
python·学习·数据分析·matplotlib
1-1=037 分钟前
Python3 开发环境
python
miofly1 小时前
GitHub 今日推荐|MOSS-Image:靠坐标框精确控制文字排版的图像生成模型
python·开源·github
Tiandaren1 小时前
么是agent、为什么要做agent、怎么做agent、怎么工程化
人工智能·python·深度学习·大模型
张张123y1 小时前
后端第十一课:RAG 落地实战(从 0 到 1 接上私有知识库,并设计一个好用的 RAG)
开发语言·人工智能·python·机器学习·fastapi·rag
golang学习记1 小时前
Python vs Go:2026年到底该怎么选
java·vscode·python·golang·pycharm·goland
江厌012 小时前
移动工作站还是塔式?用三个数判断工位形态,再谈配置
python·移动工作站·塔式工作站·工作站选型·isv认证
川石课堂软件测试2 小时前
涨薪技术|0到1学会性能测试第8课-Analysis分析图
服务器·数据库·python·sql·jmeter·mysql·容器