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

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

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

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

Важный

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

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам