Изменение аргументов класса в дочернем процессе? Использую 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
204 +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 Апр в 13:19
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 493 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир