LINUX.ORG.RU

Общие данные в мультипроцессорном Python3

 ,


0

1

Приветствую. Сел я тут небольшую утилиту накидать на Python3 и столкнулся с одной проблемой - а как в питоне создать и передавать словарь с объектами между процессами? Подчеркну - не между потоками, а между процессами. Мне надо чтобы в памяти основного процесса висел словарь из которого рабочие процессы будут получать объекты и при необходимости изменять состояние объекта. Нагуглил про Manager из multiprocessing, но там засада - оно не умеет изменять состояние объектов в словаре. Можно только весь объект пересоздать с новым состоянием. Что-то мне это как-то фу. Хочется простого Object.x += 1

Подскажите по каким страшным словам гуглить и читать?

Пы.Сы. Возможно я просто плохо представляю что надо использовать и вообще криво начал писать. Поэтому попробую накидать что вообще оно должно делать - хочу запустить сервер, который будет принимать сообщения через сокет, на каждое сообщение будет создаваться новый процесс, которому будет передаваться это сообщение. Этот процесс будет парсить сообщение и изменять общий словарь с объектами. Ну и какой-то ещё один процесс будет регулярно считывать состояния объектов и соответственно сообщать - кто умер, кто ожил, кого лечить, кого закапывать. Может я не правильно представляю как оно делается?

Пы.Сы. Возможно я просто плохо представляю что надо использовать и вообще криво начал писать. Поэтому попробую накидать что вообще оно должно делать - хочу запустить сервер, который будет принимать сообщения через сокет, на каждое сообщение будет создаваться новый процесс, которому будет передаваться это сообщение. Этот процесс будет парсить сообщение и изменять общий словарь с объектами. Ну и какой-то ещё один процесс будет регулярно считывать состояния объектов и соответственно сообщать - кто умер, кто ожил, кого лечить, кого закапывать.

С такой постановкой задачи взять лучше Erlang/Elixir.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

Может можете посоветовать как поменять постановку задачи, или рабочую схему, чтобы под это подошёл питон?

Toten_Kopf
() автор топика

Через внешний брокер сообщений, очереди и т.п.

Или, если сразу асинхронно делать, то просто через «встроенные» очереди.

vvn_black ★★★★★
()
Ответ на: комментарий от Toten_Kopf

Для этого используют другие инструменты, например shared memory и Redis.

В 3.8 своя шара появилась, кстати: https://docs.python.org/3/library/multiprocessing.shared_memory.html#multiprocessing.shared_memory.SharedMemory

Я, правда, сам не пробовал.

WitcherGeralt ★★
()
Ответ на: комментарий от vvn_black

Я вчера, когда гуглил, вот на токое наткнулся: https://www.cyberforum.ru/python-beginners/thread2521147.html

Поскольку используется python3.6 то читал по диагонали, и что-то там увидел про то что поддерживаются только элементарные типы. Скорее всего понял не правильно и буду копать глубже.

Toten_Kopf
() автор топика
Ответ на: комментарий от WitcherGeralt

За подсказку про Redis - спасибо. Хотелось не использовать ничего кроме питона, но похоже придётся.

Toten_Kopf
() автор топика

Через Redis это делается, или для своих утилит бери Go, а не питончик, он для другого создан, для быстрого прототипирования

menangen ★★★★★
()

shared memory

anonymous
()
Ответ на: комментарий от menangen

Спасибо за ещё один вариант. Наверное возьму Redis, судя по кол-ву рекомендаций.

Toten_Kopf
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.