当前位置: 移动技术网 > IT编程>脚本编程>Python > Python multiprocess pool模块报错pickling error问题解决方法分析

Python multiprocess pool模块报错pickling error问题解决方法分析

2019年06月11日  | 移动技术网IT编程  | 我要评论

兰世立近况,多谢关心,tftp服务器是什么

本文实例讲述了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.
2.
3.

更多关于python相关内容感兴趣的读者可查看本站专题:《python进程与线程操作技巧总结》、《python数据结构与算法教程》、《python函数使用技巧总结》、《python字符串操作技巧汇总》、《python入门与进阶经典教程》、《python+mysql数据库程序设计入门教程》及《python常见数据库操作技巧汇总

希望本文所述对大家python程序设计有所帮助。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网