当前位置: 首页 > 面试题库 >

Python-使用多重处理Pool.map()时无法Pickling

公冶嘉茂
2023-03-14
问题内容

我正在尝试使用multiprocessingPool.map()功能同时划分工作。当我使用以下代码时,它可以正常工作:

import multiprocessing

def f(x):
    return x*x

def go():
    pool = multiprocessing.Pool(processes=4)        
    print pool.map(f, range(10))


if __name__== '__main__' :
    go()

但是,当我以更加面向对象的方式使用它时,它将无法正常工作。它给出的错误信息是:

PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup
__builtin__.instancemethod failed
当以下是我的主程序时,会发生这种情况:

import someClass

if __name__== '__main__' :
    sc = someClass.someClass()
    sc.go()

这是我的someClass课:

import multiprocessing

class someClass(object):
    def __init__(self):
        pass

    def f(self, x):
        return x*x

    def go(self):
        pool = multiprocessing.Pool(processes=4)       
        print pool.map(self.f, range(10))

任何人都知道问题可能是什么,或解决问题的简单方法?


问题答案:

问题在于,多处理必须使进程中的东西腌制,而绑定的方法却不能腌制。解决方法(无论你是否认为它“容易” 是向你的程序中添加基础结构,以允许对这些方法进行腌制,并使用copy_reg标准库方法进行注册。

例如,史蒂文·贝萨德(Steven Bethard)对这个线程的贡献(接近线程的结尾)显示了一种非常可行的方法,该方法允许通过进行酸洗/取消酸洗copy_reg



 类似资料:
  • 问题内容: 我正在Ubuntu 14.04上使用Python 3.4进行开发。我试图做递归。在我调用之后,它挂在那里并且永远不会返回。 问题答案: 这是不可能的。所述对象本身不能安全进程之间被共享,所以相同的池不能在两者中使用和。即使您 可以 执行此操作,也很快会导致挂起,因为您的池仅限于并发工作程序。一旦开始递归地创建更多的工作人员,您最终将获得比工作人员更多的工作量,这将永远无法完成。正在运行

  • 问题内容: 我有一个执行一些模拟并以字符串格式返回数组的函数。 我想运行模拟(函数)以更改输入参数值(超过10000个可能的输入值),并将结果写入单个文件。 我正在使用多重处理,特别是pool.map函数来并行运行模拟。 由于运行仿真功能超过10000次的整个过程需要很长时间,因此我真的很想跟踪整个操作的过程。 我认为下面我当前代码中的问题是,pool.map运行该函数10000次,在这些操作过程

  • 问题内容: 我想知道是否有人可以指向我简单地等效于java中python的多处理模块。 我有一个简单的并行处理场景(其中没有2个进程交互):取一个数据集并将其分成12个,然后将Java方法应用于12个数据集,收集结果并将它们按相同的顺序加入到某种列表中。 作为“专业”语言的Java似乎具有多个库和方法-谁能帮助这个Java新手入门? 我想用最少的编码做到这一点-正如我说的那样,我的要求非常简单。

  • 问题内容: 我不能用一个简单的例子再现这个错误,而且我的代码太复杂了,无法发布。如果我用而不是普通的Python来运行程序,事情会很顺利。 我查阅了以前关于这个问题的一些笔记。它们都是由使用池调用类函数中定义的函数引起的。但对我来说不是这样。 我很感激你的帮助。 更新:函数是在模块的顶层定义的。尽管它调用包含嵌套函数的函数。调用调用,)有一个嵌套函数,我正在调用。、、)都是在顶层定义的。我用这个模

  • 问题内容: 现在,我在框架中有一个中央模块,该模块使用模块产生多个进程。由于使用,因此存在模块级的多处理感知日志。根据文档,此记录器具有进程共享的锁,因此你不会通过同时写入多个进程来乱码内容(或任何文件句柄)。 我现在遇到的问题是框架中的其他模块不支持多处理。以我的方式看,我需要使这个中央模块上的所有依赖项都使用支持多处理的日志记录。在框架内这很烦人,更不用说框架的所有客户了。有我没有想到的替代方

  • 问题内容: 最初,我有一个类来存储一些处理后的值,并将其与其他方法重用。 问题是,当我尝试将类方法划分为多个进程以加快速度时,python生成了进程,但它似乎不起作用(正如我在“任务管理器”中看到的那样,只有1个进程在运行)并且结果从未交付。 我进行了几次搜索,发现pathos.multiprocessing可以代替它,但是我想知道标准库是否可以解决这个问题? 问题答案: 您的代码失败了,因为它无