Python Синхронизация JSON данных
Есть программа, в которой запущен процесс. В этом процессе циклично запускаются уже другие процессы. Мне нужно синхронизировать данные между ВСЕМИ процессами, как родительстким, так и дочерними.
В данный момент данные одного процесса перезаписывают данные другого, из-за чего часть данных теряется.
Я пробовал использовать multiprocessing.Queue, однако это позволяет связать лишь два процесса.
Я пытался передавать экземпляр класса в args процесса, чтобы попытаться синхронизировать данные с помощью него, используя self, однако данные изменялись лишь в области дочернего процесса -- в родительском процессе этих изменений не было.
Я пытался использовать глобальную переменную, но, опять же, даже при указании в функции global varname, значение переменной varname процессом не изменялось.
Я пытался реализовать идею с помощью 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 шт):
Типы должны быть из 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}