Вернуть None Значение свойства объекта в многопроцессорной обработке python - PullRequest
0 голосов
/ 15 января 2020

У меня есть два класса A и B, попробуйте изменить значение собственной переменной с выполнением многопроцессорной обработки и вернуть значение None:

Класс A:

class A:
    def __init__(self):
        self.value = None

    def update_value(self, new_value):
        print('Value in class A : ', new_value)
        self.value = new_value

    def get_value(self):
        return self.value

Класс B:

from A import A
import multiprocessing as mp

instance_1 = A()

instance_2 = A()


p1 = mp.Process(target=instance_1.update_value, args=[100])
p2 = mp.Process(target=instance_2.update_value, args=[200])

p1.start()
p2.start()

p1.join()
p2.join()

print('Value in class B', instance_1.value)

print('Value in class B', instance_2.value)

Результат:

Value in class A :  100
Value in class A :  200
Value in class B None
Value in class B None

I Я хочу получить одинаковые результаты в классе A и B из переменной значения. Как это сделать?

1 Ответ

0 голосов
/ 15 января 2020

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

import multiprocessing as mp
from multiprocessing.managers import BaseManager

class A:
    def __init__(self):
        self.value = None

    def update_value(self, new_value):
        print('Value in class A : ', new_value)
        self.value = new_value

    def get_value(self):
        return self.value

manager = BaseManager()
manager.register('A', A)
manager.start()
shared1 = manager.A()
shared2 = manager.A()


p1 = mp.Process(target=shared1.update_value, args=(100,))
p2 = mp.Process(target=shared2.update_value, args=(200,))

p1.start()
p2.start()

p1.join()
p2.join()

print('Value in class B', shared1.get_value())
print('Value in class B', shared2.get_value())

Вывод:

Value in class A :  100
Value in class A :  200
Value in class B 100
Value in class B 200
...