现象

multiprocessing.Pool传递一个普通方法(不在class中定义的)时, 能正常工作.

from multiprocessing import Poolp = Pool(3)
def f(x):return x*xp.map(f, [1,2,3])

但在class中定义的方法使用multiprocessing.Pool会报pickling error错误.

报错代码

# coding: utf8
import multiprocessingclass MyTask(object):def task(self, x):return x*xdef run(self):pool = multiprocessing.Pool(processes=3)a = [1, 2, 3]pool.map(self.task, a)if __name__ == '__main__':t = MyTask()t.run()

会出现如下异常:

cPickle.PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed

原因:

stackoverflow上的解释:
Pool methods all use a queue.Queue to pass tasks to the worker processes. Everything that goes through the queue.Queue must be pickable. So, multiprocessing can only transfer Python objects to worker processes which can be pickled. Functions are only picklable if they are defined at the top-level of a module, bound methods are not picklable.

pool方法都使用了queue.Queue将task传递给工作进程。multiprocessing必须将数据序列化以在进程间传递。方法只有在模块的顶层时才能被序列化,跟类绑定的方法不能被序列化,就会出现上面的异常。

解决方法:

  1. 用线程替换进程
  2. 可以使用copy_reg来规避上面的异常.
  3. dillpathos.multiprocesssing :use pathos.multiprocesssing, instead of multiprocessing. pathos.multiprocessing is a fork of multiprocessing that uses dill. dill can serialize almost anything in python, so you are able to send a lot more around in parallel.

正确代码1

 # coding: utf8
from multiprocessing.pool import ThreadPool as Poolclass MyTask(object):def task(self, x):return x*xdef run(self):pool = Pool(3)a = [1, 2, 3]ret = pool.map(self.task, a)print retif __name__ == '__main__':t = MyTask()t.run()

正确代码2:

# coding: utf8
import multiprocessing
import types
import copy_regdef _pickle_method(m):if m.im_self is None:return getattr, (m.im_class, m.im_func.func_name)else:return getattr, (m.im_self, m.im_func.func_name)copy_reg.pickle(types.MethodType, _pickle_method)class MyTask(object):def __init__(self):self.__result = []def task(self, x):return x * xdef result_collector(self, result):self.__result.append(result)def run(self):pool = multiprocessing.Pool(processes=3)a = [1, 2, 3]ret = pool.map(self.task, a)print retif __name__ == '__main__':t = MyTask()t.run()

multiprocessing.Pool报pickling error相关推荐

  1. python class函数报错_Python multiprocess pool模块报错pickling error问题解决方法分析

    本文实例讲述了Python multiprocess pool模块报错pickling error问题解决方法.分享给大家供大家参考,具体如下: 问题 之前在调用class内的函数用multiproc ...

  2. 使用 Multiprocessing.Pool.map_async 报错 attribute lookup <lambda> on __main__ failed 的解决

    使用 Multiprocessing.Pool.map_async 报错 attribute lookup on __main__ failed 的解决 创作背景 问题再现 解决方法 十六 char ...

  3. python进程池win出错_解决windows下python3使用multiprocessing.Pool出现的问题

    例如: from multiprocessing import Pool def f(x): return x*x pool = Pool(processes=4) r=pool.map(f, ran ...

  4. mysql报错ERROR 1206 (HY000): The total number of locks exceeds the lock table size的解决方法...

    1. 问题背景         InnoDB是新版MySQL(v5.5及以后)默认的存储引擎,之前版本的默认引擎为MyISAM,因此,低于5.5版本的mysql配置文件.my.cnf中,关于InnoD ...

  5. python 多进程 multiprocessing.Queue()报错:The freeze_support() line can be omitted if the program

    运行以下多进程测试代码时报错: # -*- coding: utf-8 -*- """ @File : test_191205_测试多进程Multiprocessing_ ...

  6. multiprocessing.pool详解

    由于python有全局锁限制,如果想利用多核,就需要使用多进程模块,但该模块有很多坑,本篇文章记录一下其用法以及踩过的坑. 一.map.apply.apply_async对比 先贴一个对比图,引自mu ...

  7. 在windows下python3使用multiprocessing.Pool时出现的问题

    例如: from multiprocessing import Pool def f(x): return x*x pool = Pool(processes=4) r=pool.map(f, ran ...

  8. 一、multiprocessing.pool.RemoteTraceback

    遇到如下问题多半时数据有问题`. // A code block var foo = 'bar'; multiprocessing.pool.RemoteTraceback: "" ...

  9. Flex报错Error #2048: 安全沙箱冲突

    Flex+JPA架构,JPA程序迁移,从A服务器到B.其他一切没变,唯一变的就是IP. 前端Flex也就是swf报错Error #2048: 安全沙箱冲突:http://xxx.swf 不能从 xxx ...

最新文章

  1. 【机器学习基础】重磅发布!吴恩达 AI 完整课程资源超级大汇总!
  2. REVERSE-PRACTICE-JarvisOJ-2
  3. mysql 存储过程代码_MySQL存储过程及常用函数代码解析
  4. ajax-form表单快速传递参数
  5. ZOJ - 3591 NIM
  6. 《BI那点儿事》数据流转换——派生列
  7. 一条语句引发的思考:装箱和拆箱,空指针的类型转换
  8. linux 进程意外关闭,Webdriver异常:进程意外关闭,状态为1
  9. Android Behavior详解
  10. JanusGraph对于Gremlin查询语言的介绍
  11. 百度云网盘一直显示“下载请求中”,一个 解决办法
  12. 【题目回顾】广工大2020年10月ACM第一次月赛B题--Dio的面包工坊
  13. Jetpack Room基本用法
  14. agc013e Placing Squares(模型转化+dp+矩阵优化)
  15. 断点续传的原理(转)
  16. ArcGIS删除字段
  17. 【评测】MP DSS肠炎模型专用
  18. Java使用Tesseract-OCR文字识别(Java调用tess4j提取图片中文、英文、数字信息)
  19. [TJOI2013]黄金矿工解题报告
  20. vivo脑洞大开,竟给手机内置微型无人机!

热门文章

  1. nn.Embedding
  2. Cubist software
  3. 用c语言实现银行贷款程序(等额本息还款法、等额本金还款法)
  4. Android Camera2 教程 · 第一章 · 概览
  5. 【学习记录】【python】【opencv】自学简要记录(未完)
  6. 5G 中 BWP概念
  7. 第一篇:坚持做难而正确的事情
  8. NOIP2022 T4 比赛
  9. bugku 想蹭网先解开密码
  10. tomcat启动失败问题