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

相关推荐
青少儿编程课堂33 分钟前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:中缀表达式求值解析
c++·python·算法·bfs·信息学竞赛
灿飞屋3 小时前
Kotlin与Java虚拟机四:函数
java·python·kotlin·安卓·android jetpack
一晌小贪欢4 小时前
Python基础:第 09 篇 · while 循环:重复直到不满足
开发语言·c++·python·数据可视化·面向对象·python办公
一条大祥脚5 小时前
CuTe 与 CuTe DSL:从 C++ 模板元编程到 Python DSL 的 GPU 编程演进
开发语言·c++·python·cutlass·cute·cute dsl
10年前端老司机5 小时前
Milvus 8种检索能力实践
数据库·python·agent
Sakura_j_h_6 小时前
从零写一个 MCP stdio Server:用 Python 校验博客文章格式
开发语言·python·自动化·ai工具·mcp·json-rpc
大草原的小灰灰6 小时前
LLM应用的标准开发框架LangChain(八)- 中间件
python·中间件·langchain
卷无止境6 小时前
百万 token 时代的真相:主流大模型上下文窗口与最大输出的横向对比分析
人工智能·python
用户298698530147 小时前
Python 实战:将 HTML 批量转换为 Markdown
python·html·markdown
hhcgchpspk7 小时前
flask服务端页面预防被爬措施
后端·python·flask·网络爬虫·防爬