Изменение аргументов класса в дочернем процессе? Использую Python 3.6 и столкнулся с интересной проблемой: Допустим у нас есть класс и какой-то словарь, при его инициализации в этот словарь записывается какое-то значениеclass test: test_dictionary = {} def __init__(self, name): self.test_dictionary[name] = [1,2] Далее при инициализации запускается дочерний процесс multiprocessingimport 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. Имеется в виду что значения, почему-то, изменяются лишь локально, хотя это ведь метод класса.
Проблема здесь заключается в том, что при передаче аргументов в дочерний процесс они копируются, а не передаются по ссылке. Поэтому изменения, внесенные в дочернем процессе, не отражаются на родительском процессе.
Для того чтобы передать изменения обратно в родительский процесс, можно использовать специальные объекты для обмена данными между процессами, такие как multiprocessing.Queue или multiprocessing.Array. В данном случае можно создать такой объект и передавать его в качестве аргумента в дочерние процессы.
Пример использования очереди для передачи данных обратно в родительский процесс:
В данном примере мы создаем очередь self.queue в родительском процессе и передаем ее в дочерние процессы. После изменения значения в дочернем процессе, мы добавляем измененное значение в очередь. После завершения работы дочернего процесса, мы можем получить измененное значение из очереди в родительском процессе.
Проблема здесь заключается в том, что при передаче аргументов в дочерний процесс они копируются, а не передаются по ссылке. Поэтому изменения, внесенные в дочернем процессе, не отражаются на родительском процессе.
Для того чтобы передать изменения обратно в родительский процесс, можно использовать специальные объекты для обмена данными между процессами, такие как multiprocessing.Queue или multiprocessing.Array. В данном случае можно создать такой объект и передавать его в качестве аргумента в дочерние процессы.
Пример использования очереди для передачи данных обратно в родительский процесс:
import multiprocessing as mpimport time
class test:
def __init__(self, name):
self.test_dictionary = {name: [1, 2]}
self.queue = mp.Queue()
p1 = mp.Process(target=self.change_value1, args=(name, 3, 4))
p1.start()
p1.join()
print(self.test_dictionary[name]) # [3, 4]
def change_value1(self, name, new_value1, new_value2):
p2 = mp.Process(target=self.change_value2, args=(name, new_value1, new_value2))
p2.start()
p2.join()
print(self.test_dictionary[name]) # [6, 8]
def change_value2(self, name, new_value1, new_value2):
self.test_dictionary[name] = [new_value1, new_value2]
if __name__ == '__main__':
t = test('example')
В данном примере мы создаем очередь self.queue в родительском процессе и передаем ее в дочерние процессы. После изменения значения в дочернем процессе, мы добавляем измененное значение в очередь. После завершения работы дочернего процесса, мы можем получить измененное значение из очереди в родительском процессе.