169 похожих чатов

У меня есть пачка процессов, которые выполняют какую-нибудь абстрактную логику,

взаимодействуя друг с другом. Я их оборачиваю в супервизор и хочу запускать как один процесс (типа {:ok, pid} = WrappingSupervisor.start_link(_)), но при этом, я хочу запускать несколько экземпляров этого процесса.

Если я регистрирую их по имени (например, name: __MODULE__), то больше одного экземпляра я не запущу. Можно запускать какое-нибудь Registry внутри, но сам регистри тоже надо как-то регать. И, как я понял, нет вариантов его стартануть отдельно, прокинув pid, потому что апишка к регистри предполагает использование атомов как идентификаторов.

Какие ещё есть варианты?

22 ответов

20 просмотров

А как ты хочешь чтобы к ним обращались, если ты хочешь несколько процессов под одним именем?

у тебя процессы общаются ациклическим графом?

Андрей- Автор вопроса
Lama Lover
А как ты хочешь чтобы к ним обращались, если ты хо...

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

Андрей
Я не хочу несколько процессов под одним именем. Я ...

Так, а как они общаются? Каждый с каждым? Тогда пусть стартуется какой-нибудь процесс-мастер или Registry, в котором все воркеры будут регистрироваться и у которого воркеры будут спрашивать имена соседей

у нас есть нечто отдаленно похожее, мы запускаем процессы под gen_tracker на тип в правильном порядке, и каждый из них в процессе инициализации резолвит и кэширует нужные ему пиды.

Андрей- Автор вопроса
Alex Bubnov
у тебя процессы общаются ациклическим графом?

Циклов нет, да. Т.е. в теории можно их последовательно стартануть, пробрасывая пиды тех, что были выше. Но это выглядит как слишком много действий руками. Да и пихать под супервизор не очень удобно.

Андрей- Автор вопроса
Lama Lover
Так, а как они общаются? Каждый с каждым? Тогда пу...

Типа мастер регистри на все процессы-супервизоры?

Андрей
Типа мастер регистри на все процессы-супервизоры?

Не понял. У тебя несколько супервизоров, и все чайлды этих всех супервизоров общаются между собой?

Андрей- Автор вопроса
Lama Lover
Не понял. У тебя несколько супервизоров, и все чай...

Все чайлды супервизора общаются в пределах супервизора.

Lama Lover
Не понял. У тебя несколько супервизоров, и все чай...

это стандартный паттерн "контроллер + пачка воркеров под общим супервизором", насколько я понял

Андрей
Все чайлды супервизора общаются в пределах суперви...

Ну вот рядом к этому супервизору стартуй Registry. И пусть воркеры в нём регаются. Аля MasterSup all for one |- Registry |- WorkerSup |- Worker1 |- Worker2 ...

Андрей- Автор вопроса
Lama Lover
Ну вот рядом к этому супервизору стартуй Registry....

Ну, этот вариант я упомянул вначале. Тут возникает проблема, как работать с этим регистри, не регистрируя его по имени.

Андрей
Ну, этот вариант я упомянул вначале. Тут возникает...

Так и не регистрируй его по имени. Можешь сделать через DynamicSupervisor, чтобы препендился аргумент с пидом Registry А так, лучше регать по имени, чтобы у тебя был общий префикс для всего пула (аля Pool1) И у процессов были имена типа Pool1.MasterSup, Pool1.Registry, Pool1.WorkerSup, а у воркеров были имена из Registry

Андрей- Автор вопроса
Lama Lover
Так и не регистрируй его по имени. Можешь сделать ...

Как я сказал, так сделать нельзя. Либо я не понял твою схему.

Андрей
screenshot Как я сказал, так сделать нельзя. Либо я не понял ...

Ну ты ещё можешь сделать глобальный регистри для этих пуллов и регать в него типа {pool_name, worker_name}

Андрей
screenshot Как я сказал, так сделать нельзя. Либо я не понял ...

А почему ты не можешь назвать пулл как-нибудь?

Андрей- Автор вопроса
Lama Lover
А почему ты не можешь назвать пулл как-нибудь?

В принципе могу. Но хотелось не генерить атомы динамически.

Андрей
В принципе могу. Но хотелось не генерить атомы дин...

То есть у тебя эти пуллы появляются в рантайме? Или может их заданное число в конфиге (или они известны на момент инициализации)?

Андрей- Автор вопроса
Lama Lover
То есть у тебя эти пуллы появляются в рантайме? Ил...

Задаются в конфиге, так что бесконечное количество их не появится, да.

Андрей
Задаются в конфиге, так что бесконечное количество...

Ну тогда сделай префикс атомом просто, это будет самое удобное. Лучше чтобы префикс тоже в конфиге задавался

Похожие вопросы

Обсуждают сегодня

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
DS
8
Карта сайта