Изменение аргументов класса в дочернем процессе? Использую 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. Имеется в виду что значения, почему-то, изменяются лишь локально, хотя это ведь метод класса.

21 Авг 2019 в 06:21
250 +1
0
Ответы
1

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

Для того чтобы передать изменения обратно в родительский процесс, можно использовать специальные объекты для обмена данными между процессами, такие как multiprocessing.Queue или multiprocessing.Array. В данном случае можно создать такой объект и передавать его в качестве аргумента в дочерние процессы.

Пример использования очереди для передачи данных обратно в родительский процесс:

import multiprocessing as mp
import 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 в родительском процессе и передаем ее в дочерние процессы. После изменения значения в дочернем процессе, мы добавляем измененное значение в очередь. После завершения работы дочернего процесса, мы можем получить измененное значение из очереди в родительском процессе.

20 Апр 2024 в 13:19
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир