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 相关文章推荐
Pycharm学习教程(5) Python快捷键相关设置
May 03 Python
Python编写一个优美的下载器
Apr 15 Python
python实现对任意大小图片均匀切割的示例
Dec 05 Python
Python 实现自动获取种子磁力链接方式
Jan 16 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
Jan 19 Python
Python startswith()和endswith() 方法原理解析
Apr 28 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
May 17 Python
Keras自动下载的数据集/模型存放位置介绍
Jun 19 Python
Python+Opencv身份证号码区域提取及识别实现
Aug 25 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
Sep 11 Python
selenium如何定位span元素的实现
Jan 13 Python
Python中Permission denied的解决方案
Apr 02 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
PHPEXCEL 使用小记
2013/01/06 PHP
PHP获取MSN好友列表类的实现代码
2013/06/23 PHP
ThinkPHP基本的增删查改操作实例教程
2014/08/22 PHP
php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
2020/03/02 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
javascript笛卡尔积算法实现方法
2015/04/08 Javascript
JavaScript拖拽、碰撞、重力及弹性运动实例分析
2016/01/08 Javascript
JavaScript实现仿淘宝商品购买数量的增减效果
2016/01/22 Javascript
jQuery EasyUI封装简化操作
2016/09/18 Javascript
JS 在数组指定位置插入/删除数据的方法
2017/01/12 Javascript
详解vue-router 2.0 常用基础知识点之router.push()
2017/05/10 Javascript
vue将时间戳转换成自定义时间格式的方法
2018/03/02 Javascript
js module大战
2019/04/19 Javascript
Angular4.0动画操作实例详解
2019/05/10 Javascript
JS数组中对象去重操作示例
2019/06/04 Javascript
使用jQuery mobile NuGet让你的网站在移动设备上同样精彩
2019/06/18 jQuery
JavaScript 实现自己的安卓手机自动化工具脚本(推荐)
2020/05/13 Javascript
vue 使用饿了么UI仿写teambition的筛选功能
2021/03/01 Vue.js
[02:13] 完美世界DOTA2联赛PWL DAY5集锦
2020/11/03 DOTA
python发送伪造的arp请求
2014/01/09 Python
在双python下设置python3为默认的方法
2018/10/31 Python
简单了解Python3里的一些新特性
2019/07/13 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
python自动生成model文件过程详解
2019/11/02 Python
Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript实现社交分享系统
2020/04/21 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
2020/06/22 Python
Python3合并两个有序数组代码实例
2020/08/11 Python
新闻编辑自荐书范文
2014/02/12 职场文书
平面设计专业大学生职业规划书
2014/03/12 职场文书
文明城市创建标语
2014/06/16 职场文书
上市公司财务总监岗位职责
2015/04/03 职场文书
联谊活动总结范文
2015/05/09 职场文书
上甘岭观后感
2015/06/10 职场文书
​(迎国庆)作文之我爱我的祖国
2019/09/19 职场文书
mysq启动失败问题及场景分析
2021/07/15 MySQL