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条件和循环的使用方法
Nov 01 Python
跟老齐学Python之使用Python操作数据库(1)
Nov 25 Python
举例区分Python中的浅复制与深复制
Jul 02 Python
浅析Python中yield关键词的作用与用法
Nov 29 Python
使用Python生成XML的方法实例
Mar 21 Python
PyQt5 pyqt多线程操作入门
May 05 Python
在pycharm中显示python画的图方法
Aug 31 Python
python通过实例讲解反射机制
Oct 17 Python
基于Python实现签到脚本过程解析
Oct 25 Python
Python中Subprocess的不同函数解析
Dec 10 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
Feb 25 Python
python创建字典及相关管理操作
Apr 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表单微信中自动提交两次问题解决办法
2017/01/08 PHP
PHP PDO数据库操作预处理与注意事项
2019/03/16 PHP
laravel 配置路由 api和web定义的路由的区别详解
2019/09/03 PHP
event.keyCode键码值表 附只能输入特定的字符串代码
2009/05/15 Javascript
浅析javascript中的DOM
2015/03/01 Javascript
jquery中表单 多选框的一种巧妙写法
2015/09/06 Javascript
纯javascript代码实现计算器功能(三种方法)
2015/09/07 Javascript
Jquery Mobile 自定义按钮图标
2015/11/18 Javascript
jQuery ajax分页插件实例代码
2016/01/27 Javascript
Bootstrap每天必学之滚动监听
2016/03/16 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
2016/09/04 Javascript
基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )
2017/03/30 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
2017/06/13 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
2017/09/18 Javascript
JavaScript实现删除数组重复元素的5种常用高效算法总结
2018/01/18 Javascript
echarts设置图例颜色和地图底色的方法实例
2018/08/01 Javascript
js实现随机div颜色位置 类似满天星效果
2019/10/24 Javascript
jquery+ajax实现异步上传文件显示进度条
2020/08/17 jQuery
JavaScript实现简单动态表格
2020/12/02 Javascript
[35:34]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python的ORM框架SQLObject入门实例
2014/04/28 Python
Tornado服务器中绑定域名、虚拟主机的方法
2014/08/22 Python
python在windows下实现ping操作并接收返回信息的方法
2015/03/20 Python
python3实现网络爬虫之BeautifulSoup使用详解
2018/12/19 Python
详解Python 函数如何重载?
2019/04/23 Python
详解CSS3开启硬件加速的使用和坑
2017/08/21 HTML / CSS
瑞典快乐袜子:Happy Socks
2018/02/16 全球购物
回馈慈善的设计师太阳镜:DIFF eyewear
2019/10/17 全球购物
新闻专业个人求职信
2013/12/19 职场文书
高中军训广播稿
2014/01/14 职场文书
部门年终奖分配方案
2014/05/07 职场文书
团员年度个人总结
2015/02/26 职场文书
会议营销主持词
2015/07/03 职场文书
办公室管理规章制度
2015/08/04 职场文书
日本读研:怎样写好一篇日本研究计划书?
2019/07/15 职场文书
浅谈移动端中的视口(viewport)的具体使用
2021/04/13 HTML / CSS