#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. Я рассказал вам в своем верхнем комментарии под вашим вопросом, что приводит к ошибке.