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的Django框架来制作一个RSS阅读器
Jul 22 Python
浅谈Python浅拷贝、深拷贝及引用机制
Dec 15 Python
Python使用修饰器执行函数的参数检查功能示例
Sep 26 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
Feb 01 Python
使用python装饰器计算函数运行时间的实例
Apr 21 Python
python 通过麦克风录音 生成wav文件的方法
Jan 09 Python
PyQtGraph在pyqt中的应用及安装过程
Aug 04 Python
python线程join方法原理解析
Feb 11 Python
python中rb含义理解
Jun 18 Python
使用Python-OpenCV消除图像中孤立的小区域操作
Jul 05 Python
pytorch训练神经网络爆内存的解决方案
May 22 Python
Python+Selenium自动化环境搭建与操作基础详解
Mar 13 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
用Zend Encode编写开发PHP程序
2006/10/09 PHP
如何将数据从文本导入到mysql
2006/10/09 PHP
PHP函数getenv简介和使用实例
2014/05/12 PHP
destoon网站转移服务器后搜索汉字出现乱码的解决方法
2014/06/21 PHP
php中的ini配置原理详解
2014/10/14 PHP
php实现比较两个文件夹异同的方法
2015/06/18 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
2019/04/04 PHP
学习jquery之一
2007/04/27 Javascript
javascript语句中的CDATA标签的意义
2007/05/09 Javascript
ExtJS 工具栏 分页事件参数
2010/03/05 Javascript
jQuery UI Dialog控件中的表单无法正常提交的解决方法
2010/12/19 Javascript
js实现的折叠导航示例
2013/11/29 Javascript
Get中文乱码IE浏览器Get中文乱码解决方案
2013/12/26 Javascript
重写document.write实现无阻塞加载js广告(补充)
2014/12/12 Javascript
Validform+layer实现漂亮的表单验证特效
2016/01/17 Javascript
AngularJs表单验证实例详解
2016/05/30 Javascript
JS实现中国公民身份证号码有效性验证
2017/02/20 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
详谈JS中数组的迭代方法和归并方法
2017/08/11 Javascript
解决微信小程序中转换时间格式IOS不兼容的问题
2019/02/15 Javascript
如何通过shell脚本自动生成vue文件详解
2019/09/10 Javascript
Python使用htpasswd实现基本认证授权的例子
2014/06/10 Python
Python实现利用163邮箱远程关电脑脚本
2018/02/22 Python
css3实现超炫风车特效
2014/11/12 HTML / CSS
html5中valid、invalid、required的定义
2014/02/21 HTML / CSS
Champion澳大利亚官网:美国冠军运动服装
2018/05/07 全球购物
简述进程的启动、终止的方式以及如何进行进程的查看
2014/02/20 面试题
大学班级学风建设方案
2014/05/01 职场文书
运动会班级口号
2014/06/09 职场文书
北京颐和园导游词
2015/01/30 职场文书
2015年小班保育员工作总结
2015/05/27 职场文书
校园广播稿范文
2015/08/19 职场文书
2016年“6.26”禁毒宣传月系列活动总结
2016/04/05 职场文书
CSS 制作波浪效果的思路
2021/05/18 HTML / CSS
SQL基础的查询语句
2021/11/11 MySQL