Почему метод cant не может быть изменен в многопроцессорной обработке python?

#python #multiprocessing #pickle #python-multiprocessing

#python #многопроцессорная обработка #pickle #python-многопроцессорность

Вопрос:

Я новичок во всем, что связано с многопроцессорной обработкой, и моя текущая программа не работает. Я читал последние часы об этой проблеме и много перепробовал, метод в классе или вне его, а также в другом классе, и это не сработало.

 import multiprocessing as mp

class A:
    @staticmethod
    def multi():
        a = [1,2,3]
        b = 4
        prepared = list()
        for x in a:
            prepared.append((x, b))
        pool = mp.Pool(mp.cpu_count()-1)
        result = pool.starmap(method, prepared)
        pool.close()
        pool.join()
        print(result)


def method(a, x):
    return (a-x, a x)


if __name__ == "__main__":
    a = A()
    a.multi()
  

Это всего лишь пример того, как выглядит структура моего класса / метода (и это действительно работает, хотя я ничего не изменил в части многопроцессорной обработки).

Это исключение, которое я получаю:

 AttributeError: Can't pickle local object 'FeatureExtracter.<locals>.feature_extracter_fwd'
  

Было бы неплохо, если бы кто-нибудь знал решение или, по крайней мере, почему метод не может быть изменен.

Комментарии:

1. вы запускаете свой пул до того, как пул узнает о методе … создайте пул под именем if == ‘ main

2. покажите нам пример кода, который выдает ошибку.

Ответ №1:

 import multiprocessing as mp

class A:
    @staticmethod
    def multi():
        b = 4
        return [(x, b) for x in [1,2,3]]

def method(a,x): return (a-x, a x)

if __name__ == "__main__":
    with mp.Pool(mp.cpu_count() - 1) as p:
        result = p.starmap(method, A().multi())
    print(result)
  

Комментарии:

1. Спасибо за ваш ответ, но из-за структуры классов в моем проекте невозможно исключить из этого многопроцессорную часть. Может быть, есть другой способ?

2. ваш код работает для меня без проблем с python3.7

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

4. если вы разработали какой-то код и столкнулись с проблемой с ним, создайте образец кода, который выдает ошибку. не ожидайте, что люди догадаются о проблеме из воздуха. поделитесь с нами примером, чтобы мы могли воспроизвести ошибку с нашей стороны. какой смысл делиться кодом, который не выдает проблему?

5. Я рассказал вам в своем верхнем комментарии под вашим вопросом, что приводит к ошибке.