Невозможно выбрать <type 'instancemethod'> при использовании многопроцессорной обработки Pool.map () - PullRequest
203 голосов
/ 30 ноября 2009

Я пытаюсь использовать функцию multiprocessing Pool.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))

Кто-нибудь знает, в чем может быть проблема, или простой способ ее обойти?

Ответы [ 11 ]

0 голосов
/ 11 июня 2018

Обновление: по состоянию на день написания, namedTuples можно выбирать (начиная с python 2.7)

Проблема здесь в том, что дочерние процессы не могут импортировать класс объекта - в этом случае, класс P-, в случае многомодельного проекта класс P должен импортироваться в любом месте дочернего процесса. привыкнуть

быстрый обходной путь - сделать его импортируемым, воздействуя на глобальные переменные ()

globals()["P"] = P
...