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

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

Похожие вопросы