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查询阿里巴巴关键字排名的方法
Jul 08 Python
Python遍历文件夹和读写文件的实现方法
May 10 Python
go和python变量赋值遇到的一个问题
Aug 31 Python
在Python程序员面试中被问的最多的10道题
Dec 05 Python
Python内建模块struct实例详解
Feb 02 Python
Python 数据可视化pyecharts的使用详解
Jun 26 Python
Python实现发票自动校核微信机器人的方法
May 22 Python
keras实现多种分类网络的方式
Jun 11 Python
pytorch  网络参数 weight bias 初始化详解
Jun 24 Python
tensorflow 动态获取 BatchSzie 的大小实例
Jun 30 Python
基于selenium及python实现下拉选项定位select
Jul 22 Python
python关于倒排列的知识点总结
Oct 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
PHP GD 图像处理组件的常用函数总结
2010/04/28 PHP
解析wamp5下虚拟机配置文档
2013/06/27 PHP
Alliance vs Liquid BO3 第一场2.13
2021/03/10 DOTA
[JS源码]超长文章自动分页(客户端版)
2007/01/09 Javascript
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
利用jquery的获取JS文件中的字符串内容
2012/02/14 Javascript
jquery实现带复选框的表格行选中删除时高亮显示
2013/08/01 Javascript
JS.findElementById()使用介绍
2013/09/21 Javascript
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
2013/12/31 Javascript
简单实现兼容各大浏览器的js复制内容到剪切板
2015/09/09 Javascript
Javascript设计模式理论与编程实战之简单工厂模式
2015/11/03 Javascript
Javascript中Date类型和Math类型详解
2016/02/27 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
微信小程序 UI布局常用技巧整理总结
2016/12/05 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
百度地图去掉marker覆盖物或者去掉maker的label文字方法
2018/01/26 Javascript
vue实现的请求服务器端API接口示例
2019/05/25 Javascript
利用不到200行代码写一款属于你自己的js类库
2019/07/08 Javascript
JS使用正则表达式判断输入框失去焦点事件
2019/10/16 Javascript
JavaScript实现文件下载并重命名代码实例
2019/12/12 Javascript
[00:14]护身甲盾
2019/03/06 DOTA
整理Python中的赋值运算符
2015/05/13 Python
bat和python批量重命名文件的实现代码
2016/05/19 Python
python 网络编程常用代码段
2016/08/28 Python
Python爬虫实例爬取网站搞笑段子
2017/11/08 Python
scrapy爬虫实例分享
2017/12/28 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
2019/06/04 Python
Python3 实现串口两进程同时读写
2019/06/12 Python
linux环境中没有网络怎么下载python
2019/07/07 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
2020/04/08 Python
Django xadmin安装及使用详解
2020/10/26 Python
2015元旦联欢晚会结束语
2014/12/14 职场文书
毕业生入职感言
2015/07/31 职场文书
事业单位岗位说明书
2015/10/08 职场文书
mysql性能优化以及配置连接参数设置
2022/05/06 MySQL
Python实现双向链表
2022/05/25 Python