Метод экземпляра Monkey Patch не работает в Python Многопроцессорной - PullRequest
2 голосов
/ 22 января 2020

Я пытаюсь обезопасить экземпляр foo с помощью функции baz, чтобы перезаписать метод экземпляра foo.bar. Это работает изначально без участия multiprocessing.

Работает без multiprocessing

def baz(self, n):
    print('Baz' + str(n))

class Foo:
    def bar(self):
        print('Foobar')

if __name__ == '__main__':
    foo = Foo()
    foo.bar()       # Output: Foobar

    foo.bar = baz.__get__(foo)
    foo.bar(0)      # Output: Baz0

Проблема: Однако, если мы должны были пройти * * * * * * * * * * foo * * * * * * * * * * * 10 *

AttributeError: у объекта 'Foo' нет атрибута 'baz'

Почему это происходит и как мы можем это решить?

Полный код

import multiprocessing

def baz(self, n):
    print('Baz' + str(n))

class Foo:
    def bar(self):
        print('Foobar')

if __name__ == '__main__':
    foo = Foo()
    foo.bar()       # Output: Foobar

    foo.bar = baz.__get__(foo)
    foo.bar(0)      # Output: Baz0
    multiprocessing.Pool(2).map(foo.bar, [1,2,3])   # AttributeError: 'Foo' object has no attribute 'baz'

Использование Python 3.7. 4 на Ма c OS X 10.15.2 Каталина

...