multiprocessing在类中使用问题记录
问题:当在类中使用multiprocessing.Pool会报pickling error错误.
原因:pool方法都使用了queue.Queue将task传递给工作进程。multiprocessing必须将数据序列化以在进程间传递。方法只有在模块的顶层时才能被序列化,跟类绑定的方法不能被序列化,就会出现上面的异常。
解决:
方法1:用线程代替进程
# coding: utf8 from multiprocessing.pool import ThreadPool as Pool class MyTask(object): def task(self, x): return x*x def run(self): pool = Pool(3) a = [1, 2, 3] ret = pool.map(self.task, a) print ret if __name__ == '__main__': t = MyTask() t.run()
方法2:可以使用copy_reg来规避上面的异常.
# coding: utf8 import multiprocessing import types import copy_reg def _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 * x def 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 ret if __name__ == '__main__': t = MyTask() t.run()
方法3:换库(dill或者pathos)
dill 或pathos.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.
本文来自博客园,作者:27岁的太阳,转载请注明原文链接:https://www.cnblogs.com/isxjj/p/16054566.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具