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使用urllib2模块获取gravatar头像实例
Dec 18 Python
Python使用matplotlib实现基础绘图功能示例
Jul 03 Python
使用 Python 实现微信群友统计器的思路详解
Sep 26 Python
Python中的几种矩阵乘法(小结)
Jul 10 Python
Tornado实现多进程/多线程的HTTP服务详解
Jul 25 Python
Python换行与不换行的输出实例
Feb 19 Python
python实现单张图像拼接与批量图片拼接
Mar 23 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
May 25 Python
pyCharm 实现关闭代码检查
Jun 09 Python
通过实例了解Python异常处理机制底层实现
Jul 23 Python
Python 代码调试技巧示例代码
Aug 11 Python
Python实现我的世界小游戏源代码
Mar 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
php中文字符截取防乱码
2008/03/28 PHP
深入讲解PHP Session及如何保持其不过期的方法
2015/08/18 PHP
实例讲解通过​PHP创建数据库
2019/01/20 PHP
jQuery对表单的操作代码集合
2011/04/06 Javascript
checkbox全选所涉及到的知识点介绍
2013/12/31 Javascript
document.execCommand()的用法小结
2014/01/08 Javascript
javascript正则匹配汉字、数字、字母、下划线
2014/04/10 Javascript
jQuery分别获取选中的复选框值的示例
2014/06/17 Javascript
jQuery分组选择器用法实例
2014/12/23 Javascript
基于jQuery 实现bootstrapValidator下的全局验证
2015/12/07 Javascript
浅析C/C++,Java,PHP,JavaScript,Json数组、对象赋值时最后一个元素后面是否可以带逗号
2016/03/22 Javascript
js中字符型和数值型数字的互相转化方法(必看)
2017/04/25 Javascript
angular-ngSanitize模块-$sanitize服务详解
2017/06/13 Javascript
JavaScript闭包_动力节点Java学院整理
2017/06/27 Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
2018/01/31 Javascript
微信小程序scroll-view组件实现滚动动画
2018/01/31 Javascript
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
对vue 键盘回车事件的实例讲解
2018/08/25 Javascript
Vue配置marked链接添加target=&quot;_blank&quot;的方法
2019/07/19 Javascript
vue3.0中使用postcss-pxtorem的具体方法
2019/11/20 Javascript
Javascript幻灯片播放功能实现过程解析
2020/05/07 Javascript
Postman参数化实现过程及原理解析
2020/08/13 Javascript
Python使用Scrapy保存控制台信息到文本解析
2017/12/27 Python
python 查找文件名包含指定字符串的方法
2018/06/05 Python
对python数据切割归并算法的实例讲解
2018/12/12 Python
利用python计算时间差(返回天数)
2019/09/07 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
2020/09/26 Python
python实现excel公式格式化的示例代码
2020/12/23 Python
如何使用canvas绘制可移动网格的示例代码
2020/12/14 HTML / CSS
MyBag中文网:英国著名的时尚包袋电商零售网站
2020/07/31 全球购物
Unix如何在一行中运行多个命令
2015/05/29 面试题
公司培训欢迎词
2014/01/10 职场文书
中等生评语大全
2014/05/04 职场文书
2014机关党员干部“正风肃纪”思想汇报
2014/09/15 职场文书
2015元旦家电促销活动策划方案
2014/12/09 职场文书
我的中国梦心得体会范文
2016/01/05 职场文书