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入门篇之字符串
Oct 17 Python
python访问系统环境变量的方法
Apr 29 Python
在Mac OS系统上安装Python的Pillow库的教程
Nov 20 Python
python时间日期函数与利用pandas进行时间序列处理详解
Mar 13 Python
基于python实现聊天室程序
Jul 27 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
Feb 12 Python
Python使用Pandas对csv文件进行数据处理的方法
Aug 01 Python
python add_argument()用法解析
Jan 29 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
Feb 28 Python
Python定时任务APScheduler原理及实例解析
May 30 Python
如何在keras中添加自己的优化器(如adam等)
Jun 19 Python
python爬取youtube视频的示例代码
Mar 03 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实现图片简单上传
2006/10/09 PHP
Php 构造函数construct的前下划线是双的_
2009/12/08 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
2011/12/06 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
php的RSA加密解密算法原理与用法分析
2020/01/23 PHP
PHP实现简单日历类编写
2020/08/28 PHP
PHP网站常见安全漏洞,及相应防范措施总结
2021/03/01 PHP
基于jquery实现的类似百度搜索的输入框自动完成功能
2011/08/23 Javascript
js获取当前页面的url网址信息
2014/06/12 Javascript
基于BootStrap Metronic开发框架经验小结【二】列表分页处理和插件JSTree的使用
2016/05/12 Javascript
vue.js+Echarts开发图表放大缩小功能实例
2017/06/09 Javascript
NodeJS自定义模块写法(详解)
2017/06/27 NodeJs
老生常谈js中的MVC
2017/07/25 Javascript
Angular中使用better-scroll插件的方法
2018/03/27 Javascript
angular2模块和共享模块详解
2018/04/08 Javascript
JS 5种遍历对象的方式
2020/06/16 Javascript
一篇文章带你从零快速上手Rollup
2020/09/07 Javascript
Python在图片中添加文字的两种方法
2017/04/29 Python
PyQt5每天必学之布局管理
2018/04/19 Python
利用python如何处理百万条数据(适用java新手)
2018/06/06 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
2019/07/08 Python
新手入门Python编程的8个实用建议
2019/07/12 Python
python网络编程 使用UDP、TCP协议收发信息详解
2019/08/29 Python
使用python的turtle绘画滑稽脸实例
2019/11/21 Python
Django ORM实现按天获取数据去重求和例子
2020/05/18 Python
Python调用REST API接口的几种方式汇总
2020/10/19 Python
canvas三角函数模拟水波效果的示例代码
2018/07/03 HTML / CSS
印尼第一大家居、生活和家具电子商务:Ruparupa
2019/11/25 全球购物
大学生村官座谈会发言材料
2014/05/25 职场文书
大学生自我评价200字(4篇)
2014/09/17 职场文书
对照检查剖析材料
2014/09/30 职场文书
事业单位个人总结
2015/02/12 职场文书
演讲稿之开卷有益
2019/08/07 职场文书
Python 数据可视化之Matplotlib详解
2021/11/02 Python
Python使用Web框架Flask开发项目
2022/06/01 Python
基于Python实现nc批量转tif格式
2022/08/14 Python