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判断端口是否打开的实现代码
Feb 10 Python
Python中的多重装饰器
Apr 11 Python
利用python实现命令行有道词典的方法示例
Jan 31 Python
Python 判断图像是否读取成功的方法
Jan 26 Python
Django的Modelforms用法简介
Jul 27 Python
对Python中一维向量和一维向量转置相乘的方法详解
Aug 26 Python
tesserocr与pytesseract模块的使用方法解析
Aug 30 Python
python如何提取英语pdf内容并翻译
Mar 03 Python
解决python 执行sql语句时所传参数含有单引号的问题
Jun 06 Python
Python虚拟环境库virtualenvwrapper安装及使用
Jun 17 Python
零基础小白多久能学会python
Jun 22 Python
Python使用pandas导入xlsx格式的excel文件内容操作代码
Dec 24 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
JavaScript更改class和id的方法
2008/10/10 Javascript
javascript中拼接HTML字符串的最快、最好的方法
2014/06/07 Javascript
jQuery层级选择器用法分析
2015/02/10 Javascript
JS+CSS实现Li列表隔行换色效果的方法
2015/02/16 Javascript
JavaScript获取一个范围内日期的方法
2015/04/24 Javascript
iframe跨域通信封装详解
2015/08/11 Javascript
深入学习jQuery Validate表单验证
2016/01/18 Javascript
jQuery简单获取键盘事件的方法
2016/01/22 Javascript
浅谈addEventListener和attachEvent的区别
2016/07/14 Javascript
微信小程序左右滑动切换页面详解及实例代码
2017/02/28 Javascript
jquery仿微信聊天界面
2017/05/06 jQuery
JS作用域链详解
2017/06/26 Javascript
关于js中的鼠标事件总结
2017/07/11 Javascript
JQuery通过后台获取数据遍历到前台的方法
2018/08/13 jQuery
详解js访问对象的属性和方法
2018/10/25 Javascript
关于IDEA中的.VUE文件报错 Export declarations are not supported by current JavaScript version
2020/10/17 Javascript
[01:01:42]Secret vs Optic Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
Python入门篇之字符串
2014/10/17 Python
老生常谈python函数参数的区别(必看篇)
2017/05/29 Python
Python实现树的先序、中序、后序排序算法示例
2017/06/23 Python
Python爬取成语接龙类网站
2018/10/19 Python
pytorch 求网络模型参数实例
2019/12/30 Python
Transpose 数组行列转置的限制方式
2020/02/11 Python
澳大利亚墨尔本的在线时装店:LORETA
2018/09/14 全球购物
八年级生物教学反思
2014/01/22 职场文书
《小壁虎借尾巴》教学反思
2014/02/16 职场文书
《鞋匠的儿子》教学反思
2014/03/02 职场文书
幼儿园老师寄语
2014/04/03 职场文书
红领巾心向党演讲稿
2014/09/10 职场文书
未婚证明书模板
2014/10/08 职场文书
银行授权委托书格式
2014/10/10 职场文书
新党章的学习心得体会
2014/11/07 职场文书
2014年信息中心工作总结
2014/12/17 职场文书
杭州西湖英语导游词
2015/02/03 职场文书
2015年万圣节活动总结
2015/03/24 职场文书
2016年第32个教师节致辞
2015/11/26 职场文书