YardalGedal
@YardalGedal
yeah boy

Изменение аргументов класса в дочернем процессе?

Использую Python 3.6 и столкнулся с интересной проблемой:

Допустим у нас есть класс и какой-то словарь, при его инициализации в этот словарь записывается какое-то значение
class test:
    test_dictionary = {}

    def __init__(self, name):
        self.test_dictionary[name] = [1,2]


Далее при инициализации запускается дочерний процесс multiprocessing
import multiprocessing as mp
import time

class test:
    test_dictionary = {}

    def __init__(self, name):
        self.test_dictionary[name] = [1, 2]
        mp.Process(target=self.change_value1, args=(name, 3, 4)).start()

    def change_value1(self, name, new_value1, new_value2):
        mp.Process(target=self.change_value2, args=(name, new_value1, new_value2)).start() # на экране [1, 2] => [3, 4]
        time.sleep(1)
        mp.Process(target=self.change_value2, args=(name, new_value1*2, new_value2*2)).start() # на экране [1, 2] => [6, 8]

    def change_value2(self, name, new_value1, new_value2):
        print(self.test_dictionary[name])
        self.test_dictionary[name] = [new_value1, new_value2]
        print(self.test_dictionary[name])


Почему при изменении аргументов класса в дочернем процессе изменения не сохраняются? После завершения работы процесса они возвращаются к значениям по-умолчанию. Класс привёл в качестве примера.

P.S. Имеется в виду что значения, почему-то, изменяются лишь локально, хотя это ведь метод класса.
  • Вопрос задан
  • 225 просмотров
Решения вопроса 1
YardalGedal
@YardalGedal Автор вопроса
yeah boy
Проблема оказалась в том, что для каждого процесса создаётся своя копия класса.
Есть два решения:
1. Заменить multiprocessing на threading (нет)
2. Использовать что-нибудь, что позволяет передавать информацию между процессами, например multiprocessing.Value (Sharing state between processes)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы