现象

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. 密码危机:深度学习正在加速密码破解!
  2. linux下的struct sigaction
  3. visual c++ build tools的安装与使用
  4. Qt工作笔记-profile中INSTALLS的使用
  5. “System.Data.SqlClient.SqlException: A transport-level error has occurred when receiving results fro
  6. 语义分割--(DeepLabv3+)Encoder-Decoder with Atrous Separable Convolution for Semantic
  7. 03-20 专项测试-APP 启动性能分析
  8. 14.mac apche
  9. [CTO札记]李彦宏:《领导者的心态——Best of the best》
  10. G.711U在RTP中的展现
  11. 视频加密并上传至oss实现高并发访问
  12. 你问我DataX是谁?对不起,我活在Apache SeaTunnel的时代!
  13. win10连接共享打印机出现报错0x0000007c问题
  14. 揭秘小红书的种草套路
  15. C语言实现简单的五子棋
  16. 【算法】剑指offer - JZ76 删除链表中重复的结点
  17. CDO安装指南(centos7)
  18. IPad上windows远程桌面软件推荐
  19. socket通信简介(概念、函数、原理)
  20. Android 平板、手机: 忘记密码处理及刷机处理技术贴(以三星为例)

热门文章

  1. 【C语言项目实战6——指针以及应用】
  2. 新品发布常用的6个内容推广软文技巧,帮助品牌做好产品营销
  3. 设置vscode打开文件会打开新标签,不会覆盖当前的标签
  4. 增加php扩展---smbclient
  5. 网络孙子兵法 黑客攻防也有三十六计
  6. 找零钱 xynuoj 酒馆浪人的博客
  7. 手把手带你实现符合Promise/A+规范的Promise
  8. 全球与中国锁孔骨科矫形手术器械市场深度研究分析报告
  9. Mysql对死锁的处理
  10. Bugku 想蹭网先解开密码【MISC】