Python Синхронизация JSON данных

Есть программа, в которой запущен процесс. В этом процессе циклично запускаются уже другие процессы. Мне нужно синхронизировать данные между ВСЕМИ процессами, как родительстким, так и дочерними.

В данный момент данные одного процесса перезаписывают данные другого, из-за чего часть данных теряется.

  1. Я пробовал использовать multiprocessing.Queue, однако это позволяет связать лишь два процесса.

  2. Я пытался передавать экземпляр класса в args процесса, чтобы попытаться синхронизировать данные с помощью него, используя self, однако данные изменялись лишь в области дочернего процесса -- в родительском процессе этих изменений не было.

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

  4. Я пытался реализовать идею с помощью multiprocessing.Manager, но почему-то он не изменяет значение в manager следующим кодом:

    from multiprocessing import Process, Manager
    
    def f(manager):
        manager["users"][0]["coins"]+=1
    
    if __name__ == '__main__':
        manager = Manager().dict()
        manager.update({"users": [{"id": 1, "coins": 0}]})
        p = Process(target = f, args = [manager, ])
        p.start()
        p.join()
        print(manager)
    

Возможно ли как-то передать в multiprocessing.Process переменные среды, чтобы реализовать синхронизацию с помощью второго варианта? Если нет, то какой вариант будет наиболее оптимальным для решения задачи?


Ответы (1 шт):

Автор решения: gil9red

Типы должны быть из Manager, иначе не будет синхронизации данных после выполнения кода в отдельном процессе.

Поменял словарь и список на тот, что из Manager:

from multiprocessing import Process, Manager


def f(users_data):
    users_data["users"][0]["coins"] += 1


if __name__ == '__main__':
    manager = Manager()
    users_data = manager.dict()
    user_data = manager.dict({"id": 1, "coins": 0})
    users_data["users"] = manager.list([user_data])

    p = Process(target=f, args=[users_data])
    p.start()
    p.join()
    print(users_data['users'][0])
    # {'id': 1, 'coins': 1}
→ Ссылка