无法腌制 <type 'instancemethod'>使用 python 的多处理 Pool.apply_async() [英] Can't pickle <type 'instancemethod'> using python's multiprocessing Pool.apply_async()

查看:23
本文介绍了无法腌制 <type 'instancemethod'>使用 python 的多处理 Pool.apply_async()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想运行这样的东西:

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:Python26lib	hreading.py", line 522, in __bootstrap_inner
    self.run()
  File "C:Python26lib	hreading.py", line 477, in run
    self.__target(*self.__args, **self.__kwargs)
  File "C:python26libmultiprocessingpool.py", line 225, in _handle_tasks
    put(task)
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed

我看过帖子(post1 , post2) 来解决我的问题.我在第二篇文章中寻找类似 Mike McKerns 的解决方案,但没有使用悲情.

I've seen the posts (post1 , post2) to solve my problem. I'm looking for something like Mike McKerns solution in the second post but without using pathos.

推荐答案

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

This works, using copy_reg, as suggested by Alex Martelli in the first link you provided:

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()

这篇关于无法腌制 &lt;type 'instancemethod'&gt;使用 python 的多处理 Pool.apply_async()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆