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 相关文章推荐
python3访问sina首页中文的处理方法
Feb 24 Python
python数据类型_元组、字典常用操作方法(介绍)
May 30 Python
使用Python读取安卓手机的屏幕分辨率方法
Mar 31 Python
Python DataFrame.groupby()聚合函数,分组级运算
Sep 18 Python
OpenCV 边缘检测
Jul 10 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
Jul 11 Python
实例详解Python装饰器与闭包
Jul 29 Python
python实现图像全景拼接
Mar 27 Python
Python第三方包PrettyTable安装及用法解析
Jul 08 Python
解决python中0x80072ee2错误的方法
Jul 19 Python
Django 实现图片上传和下载功能
Dec 31 Python
使用python向MongoDB插入时间字段的操作
May 18 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
破解图片防盗链的代码(asp/php)测试通过
2010/07/02 PHP
php类声明和php类使用方法示例分享
2014/03/29 PHP
php截取字符串函数分享
2015/02/02 PHP
PHP 实现的将图片转换为TXT
2015/10/21 PHP
jquery 模板的应用示例
2013/11/12 Javascript
js获取url参数代码实例分享(JS操作URL)
2013/12/13 Javascript
一个简单的jquery的多选下拉框(自写)
2014/05/05 Javascript
angularjs实现与服务器交互分享
2014/06/24 Javascript
jQuery.each使用详解
2015/07/07 Javascript
jQuery网页版打砖块小游戏源码分享
2015/08/20 Javascript
实例详解AngularJS实现无限级联动菜单
2016/01/15 Javascript
JS实现一个简单的日历
2017/02/22 Javascript
Angular之指令Directive用法详解
2017/03/01 Javascript
Angular.js实现获取验证码倒计时60秒按钮的简单方法
2017/10/18 Javascript
Layui数据表格之获取表格中所有的数据方法
2018/08/20 Javascript
nodejs中各种加密算法的实现详解
2019/07/11 NodeJs
JavaScript冒泡算法原理与实现方法深入理解
2020/06/04 Javascript
在vue中给后台接口传的值为数组的格式代码
2020/11/12 Javascript
Vue 实现可视化拖拽页面编辑器
2021/02/01 Vue.js
[53:20]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 VG vs OG
2018/04/03 DOTA
Python中动态检测编码chardet的使用教程
2017/07/06 Python
python版大富翁源代码分享
2018/11/19 Python
python实现PID算法及测试的例子
2019/08/08 Python
Python 分发包中添加额外文件的方法
2019/08/16 Python
关于Flask项目无法使用公网IP访问的解决方式
2019/11/19 Python
pytorch使用 to 进行类型转换方式
2020/01/08 Python
python3格式化字符串 f-string的高级用法(推荐)
2020/03/04 Python
基于Python的图像阈值化分割(迭代法)
2020/11/20 Python
Interhome丹麦:在线预订度假屋和公寓
2019/07/18 全球购物
幼儿园春季开学寄语
2014/04/03 职场文书
低碳生活的宣传标语
2014/06/23 职场文书
大学生党校培训心得体会
2014/09/11 职场文书
领导干部作风整顿个人剖析材料
2014/10/11 职场文书
2014年学校工作总结
2014/11/20 职场文书
教育教学工作反思
2016/02/24 职场文书
详解MySQL数据库千万级数据查询和存储
2021/05/18 MySQL