Обезьяна Python, исправляющая метод класса, приводящий к ошибке в многопроцессорной обработке - PullRequest
1 голос
/ 21 октября 2019

Monkeypatching и многопроцессорность. У меня есть класс, и мне нужно заменить метод объекта какой-либо другой функцией (идея monkeypatching, и я должен сделать это, потому что я буду знать только, какая функция будет заменена во время выполнения), тогда мне нужно использовать многопроцессорность для всехобъекты, которые вызывают эти функции и что-то делают (изменяют значение атрибута).

Простой пример: у меня есть простой класс с именем Test, который имеет один атрибут и один метод с именем func

class Test:

  def __init__(self):
      self.attribute = 1

  def func(self):
      print("bye")

, создает два объекта и помещает их в список

a = Test()
b = Test()
c = [a, b]

определить другой вызов функции func2

def func2(obj):
    obj.attribute = obj.attribute + 1
    print(obj.attribute)
    print("hi")

заменить fun в объекте a func2

a.func = types.MethodType(func2, a)

запустить многопроцессорную обработку

def func123(x):
   c[x].func()
   return c[x]


if __name__ == '__main__':
    pool = multiprocessing.Pool()
    d = pool.map(func123, range(2))
    pool.close()

Исключение в потоке Thread-3: AttributeError: у объекта 'Test' нет атрибута 'func2'

Если я не использую многопроцессорность и просто вызываю a.func, все работает нормально. Кроме того, если в func123 нет возврата, коды будут работать без ошибок, но не будут обновлять значение атрибута для объекта a.

1 Ответ

0 голосов
/ 21 октября 2019

Атрибут привязки нужно указать в main .

if __name__ == '__main__':
    a.func = types.MethodType(func2, a)
    pool = multiprocessing.Pool()
    d = pool.map(func123, range(2))
    pool.close()
...