Я пытаюсь использовать словарь в своем многопроцессорном коде. Проблема в том, что когда я изменил значение одного ключа в процессе, изменения затрагивают только этот процесс. По-видимому, переменные аргументы процесса являются копией этой переменной. Я пытался использовать метод dict, но он тоже не работает. В чем моя ошибка?
import time
from multiprocessing import Process, Manager
def f1(list1, set1):
list1.append(3)
set1['func']='f1'
print('f1 dic',set1)
print('f1 list',list1)
while True:
time.sleep(3)
print('f1 dic',set1)
print('f1 list',list1)
def f2(list1):
list1.append(4)
settings_dic['func']='f2'
print('f2 dic',settings_dic)
print('f2 list',list1)
while True:
time.sleep(3)
print('f2 dic',settings_dic)
print('f2 list',list1)
if __name__ == '__main__':
# list1 = Manager().dict()
settings_dic = Manager().dict()
Global = Manager().Namespace()
list1 = [1,2]
settings_dic = {
'mode' : 'master',
'logger' : 'True',
'func' : ''
}
p_video_get = Process(target=f1, args=(list1,settings_dic,))
p_video_get.daemon = True
p_video_get.start()
p_packetTrasnmission = Process(target=f2, args=(list1,))
p_packetTrasnmission.daemon = True
p_packetTrasnmission.start()
list1.append(5)
settings_dic['func'] = 'main'
print('main dic',settings_dic)
print('main list',list1)
while True:
time.sleep(3)
print('main dic',settings_dic)
print('main list',list1)
Вы пытались использовать Manager().dict()
, но вместо этого переназначили обычный словарь той же переменной.
ОБНОВЛЯТЬ:
Как указал juanpa.arrivillaga, проблема с приведенным выше кодом заключается в том, что Manager.dict()
переназначается как обычный dict
, что означает, что он потерял ссылку на Manager.dict()
и не меняет/не передает его. Остальное - мой первоначальный ответ, в котором я думал, что ОП просто пытается передать словарь.
ОРИГИНАЛ:
Когда вы запускаете отдельный процесс, этот процесс имеет собственное адресное пространство. Если вы что-то не настроите, они не будут совместно использовать память (и, соответственно, данные). Каждый процесс получает копию аргументов, которые вы передаете, и память их процесса управляет своей собственной копией (это делается путем травления объекта и отправки его новому процессу). После копирования они не синхронизируются. Чтобы один процесс изменил данные в другом, у вас есть несколько вариантов.
Вам либо нужно настроить некоторые IPC через общую связь или общий объект. Очередь — это простой способ публиковать обновления в структуре данных, которые затем могут извлекаться другими процессами и обновлять свои собственные копии.
Или, если вы используете 3.8+, вы можете настроить общую память. Я этого не делал, и вам все равно нужно написать код для отслеживания и декодирования изменений. Но это еще один способ заставить один процесс общаться с другим.
@juanpa.arrivillaga: ты прав. Пропустил это. Только что увидел последнее задание. Не уверен, почему это было принято, поскольку это не касалось этой части. Я с радостью удалю, если ОП захочет отказаться. Или, если вы хотите опубликовать правильный ответ, я проголосую за него.
просто добавьте к ответу
Потому что ваш
settings_dic
— это обычный словарь, а не