python的pickle用法(Python multiprocess pool模块报错pickling error问题解决方法分析)
python的pickle用法
Python multiprocess pool模块报错pickling error问题解决方法分析本文实例讲述了Python multiprocess pool模块报错pickling error问题解决方法。分享给大家供大家参考,具体如下:
问题
之前在调用class内的函数用multiprocessing模块的pool函数进行多线程处理的时候报了以下下错误信息:
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
查了下官方文档发现python默认只能pickle以下的类型:
- None, True, and False
- integers, floating point numbers, complex numbers
- strings, bytes, bytearrays
- tuples, lists, sets, and dictionaries containing only picklable objects
- functions defined at the top level of a module (using def, not lambda)
- built-in functions defined at the top level of a module
- classes that are defined at the top level of a module
- instances of such classes whose dict or the result of calling getstate() is picklable (see section -
- Pickling Class Instances for details).
函数只能pickle在顶层定义的函数,很明显的class内的函数无法被pickle因此会报错。
|
import multiprocessing def work(): # top-level 函数 print "work!" class Foo(): def work( self ): # 非top-level函数 print "work" pool1 = multiprocessing.Pool(processes = 4 ) foo = Foo() pool1.apply_async(foo.work) pool1.close() pool1.join() # 此时报错 pool2 = multiprocessing.Pool(processes = 4 ) pool2.apply_async(work) pool2.close() pool2.join() # 此时工作正常 |
解决方案
调用pathos包下的multiprocessing模块代替原生的multiprocessing。pathos中multiprocessing是用dill包改写过的,dill包可以将几乎所有python的类型都serialize,因此都可以被pickle。或者也可以自己用dill写一个(有点重复造轮子之嫌啊)
参考
1. https://stackoverflow.com/questions/8804830/python-multiprocessing-picklingerror-cant-pickle-type-function
2. https://docs.python.org/3/library/pickle.html#what-can-be-pickled-and-unpickled
3. https://github.com/uqfoundation/pathos
希望本文所述对大家Python程序设计有所帮助。
原文链接:https://www.cnblogs.com/arkenstone/p/7901129.html
- python中random库的用法(Python minidom模块用法示例DOM写入和解析XML)
- python创建文件的方法(Python3.5文件读与写操作经典实例详解)
- python将字符串转换为时间格式(Python时间和字符串转换操作实例分析)
- python时间序列模式识别(Python时间序列处理之ARIMA模型的使用讲解)
- pythonselenium查看当前页面元素(python+selenium 定位到元素,无法点击的解决方法)
- 用python做一个表白视频(python仿抖音表白神器)
- python多线程有两个参数怎么传(python从子线程中获得返回值的方法)
- python 操作html(Python HTML解析模块HTMLParser用法分析爬虫工具)
- docker下运行python3(使用Docker+jenkins+python3环境搭建超详细教程)
- nginx事件模型有几种(Python实现监控Nginx配置文件的不同并发送邮件报警功能示例)
- python怎么自动生成报告(python根据文章标题内容自动生成摘要的实例)
- python3列表的使用教程(对Python3 pyc 文件的使用详解)
- python使用aes加密解密(python实现AES加密与解密)
- python3中super函数的基本用法(实例讲解Python3中abs函数)
- python3语法规则(详解Python3注释知识点)
- python中统计文本中单词数的代码(Linux上使用Python统计每天的键盘输入次数)
- 汉族(汉族的祖先是谁)
- 中国有几个名族(中国有几个民族没列入56个民族)
- 数学语文题目(语文的数学题)
- 香蕉(香蕉三种人不宜吃)
- 没钱可以快乐吗(没钱也能快乐吗)
- 快乐是什么(快乐就是)
热门推荐
- python删除列表中的重复元素(Python实现去除列表中重复元素的方法总结7种方法)
- ftp服务器登录错误(登陆FTP服务器提示530 Login authentication failed 错误的解决方法)
- idea的tomcat怎么运行项目(idea配置tomcat启动web项目的图文教程)
- css的内外边距均设置为0(详解css边距重叠的几种解决方案)
- mysql主从复制原理详解(详解MySQL kill 指令的执行原理)
- jquery 选择器的用法
- sql server表字段数据类型(SQL Server数据库中伪列及伪列的含义详解)
- 怎么查询端口是否被占用(如何查看某个端口被谁占用)
- pythondjango搭建web(PythonWeb项目Django部署在Ubuntu18.04腾讯云主机上)
- springcloud部署docker(Spring Cloud中使用jib进行docker部署的步骤详解)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9