简体   繁体   English

不能泡菜 <type 'instancemethod'> 使用python的多处理Pool.apply_async()

[英]Can't pickle <type 'instancemethod'> using python's multiprocessing Pool.apply_async()

I want to run something like this: 我想运行这样的事情:

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

but the code result the error : 但是代码导致错误:

   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

I've seen the posts ( post1 , post2 ) to solve my problem. 我看过帖子( post1post2 )解决了我的问题。 I'm looking for something like Mike McKerns solution in the second post but without using pathos. 我在第二篇文章中正在寻找类似Mike McKerns解决方案的东西,但没有使用任何麻烦。

This works, using copy_reg , as suggested by Alex Martelli in the first link you provided: 正如Alex Martelli在您提供的第一个链接中所建议的那样,使用copy_reg可以正常工作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 不能腌制<type 'instancemethod'>当使用多处理 Pool.map()</type> - Can't pickle <type 'instancemethod'> when using multiprocessing Pool.map() 多处理:池和泡菜错误—泡菜错误:不能泡菜 <type 'instancemethod'> :属性查找__builtin __。instancemethod失败 - Multiprocessing: Pool and pickle Error — Pickling Error: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed python 2.7多处理。 另一个pool.apply_async中的pool.apply_async - python 2.7 multiprocessing. pool.apply_async inside another pool.apply_async 具有共享变量(值)的Python多处理Pool.apply_async - Python multiprocessing Pool.apply_async with shared variables (Value) 使用关于pool.apply_async - Using about pool.apply_async 多处理pool.apply_async占用内存 - Multiprocessing pool.apply_async eats up memory 多处理管理器在 pool.apply_async 的非常简单的示例中失败 - Multiprocessing Manager failing on very simple example with pool.apply_async Python 多处理 pool.apply_async() 结果访问通过 result.get() 抛出 TypeError: object is not callable - Python multiprocessing pool.apply_async() result access via result.get() throws TypeError: object is not callable 将Pipe / Connection作为上下文arg传递给多处理Pool.apply_async() - Passing a Pipe/Connection as context arg to multiprocessing Pool.apply_async() 无法使用 pool.apply_async 通过多处理聚合结果 - Unable to use pool.apply_async to aggregate results with multiprocessing
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM