Переменная не изменяется в многопроцессорной обработке Python

Я пытаюсь использовать словарь в своем многопроцессорном коде. Проблема в том, что когда я изменил значение одного ключа в процессе, изменения затрагивают только этот процесс. По-видимому, переменные аргументы процесса являются копией этой переменной. Я пытался использовать метод 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)  

Потому что ваш settings_dic — это обычный словарь, а не

juanpa.arrivillaga 22.12.2020 09:55

Вы пытались использовать Manager().dict(), но вместо этого переназначили обычный словарь той же переменной.

juanpa.arrivillaga 22.12.2020 10:02
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
724
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ОБНОВЛЯТЬ:

Как указал juanpa.arrivillaga, проблема с приведенным выше кодом заключается в том, что Manager.dict() переназначается как обычный dict, что означает, что он потерял ссылку на Manager.dict() и не меняет/не передает его. Остальное - мой первоначальный ответ, в котором я думал, что ОП просто пытается передать словарь.

ОРИГИНАЛ:

Когда вы запускаете отдельный процесс, этот процесс имеет собственное адресное пространство. Если вы что-то не настроите, они не будут совместно использовать память (и, соответственно, данные). Каждый процесс получает копию аргументов, которые вы передаете, и память их процесса управляет своей собственной копией (это делается путем травления объекта и отправки его новому процессу). После копирования они не синхронизируются. Чтобы один процесс изменил данные в другом, у вас есть несколько вариантов.

Вам либо нужно настроить некоторые IPC через общую связь или общий объект. Очередь — это простой способ публиковать обновления в структуре данных, которые затем могут извлекаться другими процессами и обновлять свои собственные копии.

Или, если вы используете 3.8+, вы можете настроить общую память. Я этого не делал, и вам все равно нужно написать код для отслеживания и декодирования изменений. Но это еще один способ заставить один процесс общаться с другим.

@juanpa.arrivillaga: ты прав. Пропустил это. Только что увидел последнее задание. Не уверен, почему это было принято, поскольку это не касалось этой части. Я с радостью удалю, если ОП захочет отказаться. Или, если вы хотите опубликовать правильный ответ, я проголосую за него.

saquintes 22.12.2020 10:11

просто добавьте к ответу

juanpa.arrivillaga 22.12.2020 10:35

Другие вопросы по теме