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设计模式之单例模式实例
Apr 26 Python
Python常用库推荐
Dec 04 Python
Python 实现链表实例代码
Apr 07 Python
python 字符串转列表 list 出现\ufeff的解决方法
Jun 22 Python
Python中最大最小赋值小技巧(分享)
Dec 23 Python
python让列表倒序输出的实例
Jun 25 Python
python使用sklearn实现决策树的方法示例
Sep 12 Python
python线程安全及多进程多线程实现方法详解
Sep 27 Python
Python递归函数特点及原理解析
Mar 04 Python
Python API len函数操作过程解析
Mar 05 Python
Python Pandas常用函数方法总结
Jun 15 Python
python数字图像处理:图像简单滤波
Jun 28 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
编译问题
2006/10/09 PHP
DISCUZ 分页代码
2007/01/02 PHP
PHP及Zend Engine的线程安全模型分析
2011/11/10 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
2014/09/22 PHP
php获取excel文件数据
2017/04/21 PHP
Extjs入门之动态加载树代码
2010/04/09 Javascript
js中将字符串转换成json的三种方式
2011/01/12 Javascript
JavaScript在XHTML中的用法详解
2013/04/11 Javascript
JavaScript实现将UPC转换成ISBN的方法
2015/05/26 Javascript
4种JavaScript实现简单tab选项卡切换的方法
2016/01/06 Javascript
js实现随机抽选效果、随机抽选红色球效果
2017/01/13 Javascript
详解node HTTP请求客户端 - Request
2017/05/05 Javascript
package.json文件配置详解
2017/06/15 Javascript
完美解决axios在ie下的兼容性问题
2018/03/05 Javascript
快速了解Vue父子组件传值以及父调子方法、子调父方法
2020/07/15 Javascript
浅谈vant组件Picker 选择器选单选问题
2020/11/04 Javascript
[02:44]DOTA2英雄基础教程 魅惑魔女
2014/01/07 DOTA
Python编写检测数据库SA用户的方法
2014/07/11 Python
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
Python实现KNN邻近算法
2021/01/28 Python
python正则表达式匹配[]中间为任意字符的实例
2018/12/25 Python
python list数据等间隔抽取并新建list存储的例子
2019/11/27 Python
Python for循环搭配else常见问题解决
2020/02/11 Python
Python 串口通信的实现
2020/09/29 Python
使用CSS3实现input多选框自定义样式的方法示例
2019/07/19 HTML / CSS
Stuart Weitzman欧盟:美国奢华鞋履品牌
2017/05/24 全球购物
一个C/C++编程面试题
2013/11/10 面试题
AJAX的全称是什么
2012/11/06 面试题
安全检查验收制度
2014/01/12 职场文书
建筑设计学生的自我评价
2014/01/16 职场文书
大学生自我鉴定范文模板
2014/01/21 职场文书
连带责任保证书
2014/04/29 职场文书
幼儿园个人师德总结
2015/02/06 职场文书
导游词之永泰公主墓
2019/12/04 职场文书
html实现弹窗的实例
2021/06/09 HTML / CSS
Python中使用tkFileDialog实现文件选择、保存和路径选择
2022/05/20 Python