Как использовать приложение 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 экземпляра, который вы пытаетесь вызвать, а для удаленных вызовов также необходимо имя целевого узла.