Как использовать приложение OTP, которое уже запущено из модуля?

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

Как я могу вызывать функции x из y?
Будет ли работать что-то вроде rpc:call(Node, x, Fun, Param)?

Кроме того, необходимы ли какие-либо (сетевые) настройки для использования модуля rpc?

Важно

Если вы не можете проверить соединения между двумя узлами, убедитесь, что вы используете флаг командной строки -name и что вы включаете полное имя в свой вызов net_adm:ping/1. например если вы назвали свой узел x@localhost, вы должны пропинговать x из другого модуля, выполнив net_adm('x@localhost').. Обратите внимание на одинарные кавычки. Подробнее см. этот вопрос.


person goncalotomas    schedule 28.03.2016    source источник


Ответы (1)


То, как вы вызываете x, зависит как от его API, так и от того, работает ли x на том же узле, что и y.

  • Если x работает в том же узле, что и y, а зависимости вашего приложения объявлены таким образом, что x запускается до запуска y, вы можете просто вызвать модуль x так же, как вызов любого другого локального модуля.

  • Если x находится в другом узле, то да, используя модуль rpc, чтобы вызвать его. является одним из жизнеспособных вариантов. Пока узел y может подключаться к узлу x через Распределенный Erlang, rpc будет работать. без дополнительной настройки.

Я упоминаю API, потому что модули часто выполняют свою работу, регистрируя свои идентификаторы процессов в каком-либо реестре имен, например в локальном реестре через erlang:register/2, глобальный реестр или альтернативные реестры, такие как gproc, и вызывающим сторонам может потребоваться сначала получить прямой или косвенный доступ к реестру. чтобы найти цель, которую они пытаются вызвать. Например, при вызове экземпляра gen_server обычно необходимо передать в качестве аргумента имя или pid экземпляра, который вы пытаетесь вызвать, а для удаленных вызовов также необходимо имя целевого узла.

person Steve Vinoski    schedule 28.03.2016
comment
Спасибо!! Узлы должны быть разные, я забыл упомянуть об этом. Каким бы полезным ни был ваш ответ, я пытаюсь подключиться к узлу x, инициировав новую оболочку с помощью erl -name [email protected] -setcookie y. Я пытаюсь пропинговать x с помощью net_adm:ping(x)., но он отвечает pang. Вы хоть представляете, что я могу делать неправильно? - person goncalotomas; 29.03.2016
comment
Как называется узел x? Если у вас открыта оболочка Erlang на узле x, ее имя должно быть в приглашении оболочки. Был ли запущен x с короткими именами (используя -sname) или длинными именами (используя -name)? Вы уверены, что он использует тот же файл cookie? Если вы запустите epmd -names, будет ли указан узел x? Просто предположение, но я подозреваю, что часть 127.0.0.1 должна быть именем хоста. - person Steve Vinoski; 29.03.2016
comment
Запуск node(). на x дает [email protected]. Вот почему я назвал y [email protected]. Я считаю, что оба используют длинные имена (-name), а не короткие. Я получаю cookie от x, запуская erlang:get_cookie(). на его консоли, которая выводит x. Итак, я начинаю y с erl -name [email protected] -setcookie x, но результаты остаются прежними. Что меня также интригует, так это то, что при запуске net_adm:names() выводятся {ok,[{"x",58521},{"y",58920}]}, а epmd -names выводятся name y at port 58920, name x at port 58521. - person goncalotomas; 29.03.2016
comment
Я понял. Я должен использовать net_adm:ping('[email protected]').. Я думал, что net_adm:ping(x). будет достаточно, но, видимо, нет! Я получил эту идею из этот вопрос. - person goncalotomas; 29.03.2016
comment
Я куплю тебе кружку пива, если ты приедешь в Лиссабон в ближайшее время. Еще раз спасибо за вашу помощь. Ты обалденный. - person goncalotomas; 29.03.2016
comment
Рад, что вы разобрались с проблемой пинга, и прошу помощи. - person Steve Vinoski; 29.03.2016