взаимодействуя друг с другом. Я их оборачиваю в супервизор и хочу запускать как один процесс (типа {:ok, pid} = WrappingSupervisor.start_link(_)), но при этом, я хочу запускать несколько экземпляров этого процесса.
Если я регистрирую их по имени (например, name: __MODULE__), то больше одного экземпляра я не запущу. Можно запускать какое-нибудь Registry внутри, но сам регистри тоже надо как-то регать. И, как я понял, нет вариантов его стартануть отдельно, прокинув pid, потому что апишка к регистри предполагает использование атомов как идентификаторов.
Какие ещё есть варианты?
А как ты хочешь чтобы к ним обращались, если ты хочешь несколько процессов под одним именем?
у тебя процессы общаются ациклическим графом?
Я не хочу несколько процессов под одним именем. Я хочу, чтобы процессы могли общаться между собой, но при этом оставались инкапсулированы за общим супервизором, который можно стартовать в нескольких экземплярах.
Так, а как они общаются? Каждый с каждым? Тогда пусть стартуется какой-нибудь процесс-мастер или Registry, в котором все воркеры будут регистрироваться и у которого воркеры будут спрашивать имена соседей
у нас есть нечто отдаленно похожее, мы запускаем процессы под gen_tracker на тип в правильном порядке, и каждый из них в процессе инициализации резолвит и кэширует нужные ему пиды.
Циклов нет, да. Т.е. в теории можно их последовательно стартануть, пробрасывая пиды тех, что были выше. Но это выглядит как слишком много действий руками. Да и пихать под супервизор не очень удобно.
да, но к сожалению без вариантов.
Типа мастер регистри на все процессы-супервизоры?
Не понял. У тебя несколько супервизоров, и все чайлды этих всех супервизоров общаются между собой?
Все чайлды супервизора общаются в пределах супервизора.
это стандартный паттерн "контроллер + пачка воркеров под общим супервизором", насколько я понял
Ну вот рядом к этому супервизору стартуй Registry. И пусть воркеры в нём регаются. Аля MasterSup all for one |- Registry |- WorkerSup |- Worker1 |- Worker2 ...
Ну, этот вариант я упомянул вначале. Тут возникает проблема, как работать с этим регистри, не регистрируя его по имени.
Так и не регистрируй его по имени. Можешь сделать через DynamicSupervisor, чтобы препендился аргумент с пидом Registry А так, лучше регать по имени, чтобы у тебя был общий префикс для всего пула (аля Pool1) И у процессов были имена типа Pool1.MasterSup, Pool1.Registry, Pool1.WorkerSup, а у воркеров были имена из Registry
Как я сказал, так сделать нельзя. Либо я не понял твою схему.
Ну ты ещё можешь сделать глобальный регистри для этих пуллов и регать в него типа {pool_name, worker_name}
А почему ты не можешь назвать пулл как-нибудь?
В принципе могу. Но хотелось не генерить атомы динамически.
То есть у тебя эти пуллы появляются в рантайме? Или может их заданное число в конфиге (или они известны на момент инициализации)?
Задаются в конфиге, так что бесконечное количество их не появится, да.
Ну тогда сделай префикс атомом просто, это будет самое удобное. Лучше чтобы префикс тоже в конфиге задавался
Обсуждают сегодня