Slavenin999
@Slavenin999
программист php/erlang/elixir/js

Erlang. Как передать поток от одного процесса другому?

Доброго времени суток, Habr!

Есть OTP приложение в нём несколько супервизоров, пусть будет А и Б.
Супервизор А порождает воркера Аа.
Cупервизор Б порождает воркера Ба по запросу от Аа.

Как передать поток управления от Б в Ба, чтобы Аа ожидал ответа от Ба, а не от Б?

3ed9ead58329458fb1dec78a1aab595b.png

Как один из вариантов я рассматриваю переделывание архитектуры приложения, но это будет крайний случай.
  • Вопрос задан
  • 2404 просмотра
Решения вопроса 1
begemot_sun
@begemot_sun
Программист в душе.
в gen_server есть обработчик
handle_call(Msg, From, State) ->
PidBa ! { Msg, From },
{ noreply, State };

вот этот From -- это есть указатель на того, кто ожидает.
Т.о. вы в Ба должны каким то образом передать этот From.
Далее Ба может ответить:
gen_server:reply(From, Answer).

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

P.S. handle_call вызывается с помощью gen_server:call(Pid, Msg, Timeout).

Более подробно почитать можно тут:
www.erlang.org/doc/man/gen_server.html
а в более популярной форму тут:
learnyousomeerlang.com/clients-and-servers
или по русски в районе этого:
https://github.com/dyp2000/Russian-Armstrong-Erlang
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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