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

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

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

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

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

22 ответов

25 просмотров

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

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

Андрей- Автор вопроса
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
То есть у тебя эти пуллы появляются в рантайме? Ил...

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

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

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

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта