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

不能Pickle 使用python的多处理Pool.apply_async()

钱哲茂
2023-03-14
问题内容

我想运行这样的事情:

from multiprocessing  import Pool
import time
import random

class Controler(object):
    def __init__(self):
        nProcess = 10
        pages = 10
        self.__result = []
        self.manageWork(nProcess,pages)

def BarcodeSearcher(x):
    return x*x

def resultCollector(self,result):
    self.__result.append(result)

def manageWork(self,nProcess,pages):
    pool = Pool(processes=nProcess)
    for pag in range(pages):
        pool.apply_async(self.BarcodeSearcher, args = (pag, ), callback = self.resultCollector)

    print self.__result

if __name__ == '__main__':
    Controler()

但是代码导致错误:

   Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Python26\lib\threading.py", line 522, in __bootstrap_inner
    self.run()
  File "C:\Python26\lib\threading.py", line 477, in run
    self.__target(*self.__args, **self.__kwargs)
  File "C:\python26\lib\multiprocessing\pool.py", line 225, in _handle_tasks
    put(task)
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed

问题答案:

copy_reg正如您提供的第一个链接中Alex Martelli所建议的那样,这可以使用来工作:

import copy_reg
import types
import multiprocessing


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 Controler(object):
    def __init__(self):
        nProcess = 10
        pages = 10
        self.__result = []
        self.manageWork(nProcess, pages)

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

    def resultCollector(self, result):
        self.__result.append(result)

    def manageWork(self, nProcess, pages):
        pool = multiprocessing.Pool(processes=nProcess)
        for pag in range(pages):
            pool.apply_async(self.BarcodeSearcher, args=(pag,),
                             callback=self.resultCollector)
        pool.close()
        pool.join()

        print(self.__result)

if __name__ == '__main__':
    Controler()


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

  •   Pickling 是将 Python对象 转换为 字节流 的过程, 通常称为序列化。Unpickling 是逆操作,将 字节流 转换成 python对象, 通常称为反序列化。python中我们用pickle.dump 和 pickle.load 来实现序列化和反序列化。 ## Pickling import pickle data =  {     'Names': ["Karl","R

  • 按预期更正代码:从多处理导入池导入信号导入时间导入操作系统 ================================================== 我发现了问题,当我使用map函数时,主func被阻塞,只有map函数被funish时才会调用信号处理程序。所以,使用"map_async"函数来解决这个问题要好得多。 以下是我的发现: 纯用C语言实现的长时间运行的计算(例如对大量文本进行

  • 问题内容: 我正在尝试学习使用方法,但无法正常工作。这是文档中的代码 它应该输出 你好鲍勃 但是我得到了 没有错误或其他消息,它只是坐在那里,它从32位版本的python 2.7的Windows 7计算机上的已保存.py文件中运行 问题答案: 我的猜测是您正在使用IDLE尝试运行此脚本。不幸的是,此示例无法在IDLE中正确运行。请注意文档开头的注释: 注意:此软件包中的功能要求子 模块可以导入 主

  • 本文向大家介绍Python 中Pickle库的使用详解,包括了Python 中Pickle库的使用详解的使用技巧和注意事项,需要的朋友参考一下 在“通过简单示例来理解什么是机器学习”这篇文章里提到了pickle库的使用,本文来做进一步的阐述。 那么为什么需要序列化和反序列化这一操作呢?   1.便于存储。序列化过程将文本信息转变为二进制数据流。这样就信息就容易存储在硬盘之中,当需要读取文件的时候,

  • 问题内容: 我写了一个程序,可以总结如下: 实际代码(尤其是)要复杂得多。仅使用将其当作参数的这些值(意味着它不引用) 基本上,它将巨大的数据集加载到内存中并进行处理。输出的写操作委托给一个子进程(它实际上写到多个文件中,这需要很多时间)。因此,每次处理一个数据项时,它都会通过res_queue发送到子流程,然后该子流程根据需要将结果写入文件中。 子流程不需要访问,读取或修改以任何方式加载的数据。

  • 问题内容: 我一直在阅读有关Python的多处理模块的信息。我仍然认为我对它可以做什么没有很好的了解。 假设我有一个四核处理器,并且我有一个包含1000000个整数的列表,我想要所有整数的总和。我可以简单地做: 但这仅将其发送到一个内核。 是否有可能使用多处理模块将数组划分为多个,并让每个核获得其部分的总和并返回值,以便可以计算总和? 就像是: 任何帮助,将不胜感激。 问题答案: 是的,可以对多个