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

相关推荐
huisheng_qaq6 小时前
【Python基础篇-04】深入理解python的函数、参数与作用域
python·ai·函数·参数作用域
宸津-代码粉碎机10 小时前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
Y38153266210 小时前
SERP API 计费口径:credits_charged、执行失败扣费与退款边界
python·搜索引擎
蒸鱼Yuzheng12 小时前
设备端性能工件可靠导出:断点续传、哈希、manifest 与失败恢复
android·自动化测试·python·adb·数据完整性
圆圆讲门店13 小时前
挑选同城获客服务机构时需要考量的核心因素都有哪些?
大数据·网络·人工智能·python
傻啦嘿哟13 小时前
Python的默认参数把我坑惨了,原来写[]和写None的区别这么大
开发语言·python·机器学习
微小冷13 小时前
Python凸优化cvxpy初步
python·机器人·凸优化·数学规划·cvxpy
在世修行13 小时前
干货:显式映射 vs 自动判据
python·插件
xzal1213 小时前
Python之简单理解栈和队列
python
lupai14 小时前
维修保养记录精准版 API 对接实战指南
数据库·python