Python multiprocess pool模块报错pickling error问题解决方法分析


Posted in Python onMarch 20, 2019

本文实例讲述了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程序设计有所帮助。

Python 相关文章推荐
由Python运算π的值深入Python中科学计算的实现
Apr 17 Python
在Python的Bottle框架中使用微信API的示例
Apr 23 Python
python数据结构之图深度优先和广度优先实例详解
Jul 08 Python
详解Python的Django框架中的Cookie相关处理
Jul 22 Python
python机器学习理论与实战(五)支持向量机
Jan 19 Python
Python中装饰器学习总结
Feb 10 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
Apr 17 Python
Puppeteer使用示例详解
Jun 20 Python
Python搭建Spark分布式集群环境
Jul 05 Python
python连接PostgreSQL数据库的过程详解
Sep 18 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
May 22 Python
Python 流媒体播放器的实现(基于VLC)
Apr 28 Python
python实现对输入的密文加密
Mar 20 #Python
python实现字符串加密成纯数字
Mar 19 #Python
python实现简单加密解密机制
Mar 19 #Python
python使用adbapi实现MySQL数据库的异步存储
Mar 19 #Python
python异步存储数据详解
Mar 19 #Python
利用Python半自动化生成Nessus报告的方法
Mar 19 #Python
python实现手机销售管理系统
Mar 19 #Python
You might like
PHP常用特殊运算符号和函数总结(php新手入门必看)
2013/02/02 PHP
PHP7之Mongodb API使用详解
2015/12/26 PHP
Yii框架实现对数据库的CURD操作示例
2019/09/03 PHP
Javascript中的常见排序算法
2007/03/27 Javascript
Javascript &amp; DHTML 实例编程(教程)DOM基础和基本API
2007/06/02 Javascript
jquery1.4.2 for Visual studio 2010 模板文件
2010/07/14 Javascript
jQuery动态添加 input type=file的实现代码
2012/06/14 Javascript
jQuery根据表单name获取值的方法
2016/05/24 Javascript
深入理解JS函数的参数(arguments)的使用
2016/05/28 Javascript
带有定位当前位置的百度地图前端web api实例代码
2016/06/21 Javascript
详解使用jest对vue项目进行单元测试
2018/09/07 Javascript
AngularJS $http post 传递参数数据的方法
2018/10/09 Javascript
JS document对象简单用法完整示例
2020/01/14 Javascript
微信小程序实现列表的横向滑动方式
2020/07/15 Javascript
JavaScript实现简单动态表格
2020/12/02 Javascript
Python中使用md5sum检查目录中相同文件代码分享
2015/02/02 Python
Python实现二维有序数组查找的方法
2016/04/27 Python
Linux上安装Python的PIL和Pillow库处理图片的实例教程
2016/06/23 Python
浅谈python中字典append 到list 后值的改变问题
2018/05/04 Python
Django使用Mysql数据库已经存在的数据表方法
2018/05/27 Python
python实现抽奖小程序
2020/04/15 Python
Python内存管理实例分析
2019/07/10 Python
Python如何实现大型数组运算(使用NumPy)
2020/07/24 Python
Python抖音快手代码舞(字符舞)的实现方法
2021/02/07 Python
利用CSS3实现进度条的两种姿势详解
2017/03/21 HTML / CSS
小学新学期寄语
2014/04/02 职场文书
2014年入党积极分子党课学习心得体会模板
2014/04/03 职场文书
优秀语文教师事迹
2014/05/18 职场文书
2015年党建工作总结
2015/03/30 职场文书
2015年综治维稳工作总结
2015/04/07 职场文书
爱国主义主题班会
2015/08/14 职场文书
小学教师暑期培训心得体会
2016/01/09 职场文书
2019个人工作自我评价范文(3篇)
2019/09/19 职场文书
vue使用节流函数的踩坑实例指南
2021/05/20 Vue.js
Python自动化工具之实现Excel转Markdown表格
2022/04/08 Python
python中urllib包的网络请求教程
2022/04/19 Python