如何使用模块中已经 运行 的 OTP 应用程序?
How do I use an OTP application that's already running from a module?
我昨天问了一个 关于在另一个应用程序中使用一个应用程序的问题。
假设我想在新模块 y
.
中使用名为 x
的应用程序
x
已经编译,为了简单起见,假设它已经在本地主机上 运行ning,并且 objective 是 运行 不同节点中的两个组件。
如何从 y
中调用 x
的函数?
rpc:call(Node, x, Fun, Param)
这样的东西行得通吗?
此外,是否需要任何(网络)设置才能使用 rpc
模块?
重要
如果您无法测试两个节点之间的连接,请确保使用命令行标志 -name
并在 net_adm:ping/1
调用中包含完整名称。例如如果您将节点命名为 x@localhost
,则必须通过执行 net_adm('x@localhost').
从另一个模块 ping x
。注意单引号。有关详细信息,请参阅 this question。
如何调用 x
取决于它的 API 以及 x
是否与 y
在同一节点中 运行。
如果 x
是 运行 在与 y
相同的节点中并且您的应用程序依赖项声明为 x
在 [=12 之前启动=] 开始,你可以像调用任何其他本地模块一样简单地调用 x
的模块。
如果 x
在不同的节点中,那么是的,使用 the rpc
module to call into it is one viable option. As long as the y
node can connect to the x
node via Distributed Erlang,rpc
无需任何额外设置即可工作。
我提到 API 因为通常情况下模块通过将它们的进程 ID 注册到某种名称注册表中来完成它们的工作,例如通过 erlang:register/2
, the global registry, or alternative registries such as gproc, and callers may need to first access the registry directly or indirectly to find the target they're trying to call. For example, when calling a gen_server
instance 的本地注册表你通常需要将您尝试调用的实例的名称或 pid 作为参数传递,对于远程调用,还需要目标节点名称。
我昨天问了一个
假设我想在新模块 y
.
中使用名为 x
的应用程序
x
已经编译,为了简单起见,假设它已经在本地主机上 运行ning,并且 objective 是 运行 不同节点中的两个组件。
如何从 y
中调用 x
的函数?
rpc:call(Node, x, Fun, Param)
这样的东西行得通吗?
此外,是否需要任何(网络)设置才能使用 rpc
模块?
重要
如果您无法测试两个节点之间的连接,请确保使用命令行标志 -name
并在 net_adm:ping/1
调用中包含完整名称。例如如果您将节点命名为 x@localhost
,则必须通过执行 net_adm('x@localhost').
从另一个模块 ping x
。注意单引号。有关详细信息,请参阅 this question。
如何调用 x
取决于它的 API 以及 x
是否与 y
在同一节点中 运行。
如果
x
是 运行 在与y
相同的节点中并且您的应用程序依赖项声明为x
在 [=12 之前启动=] 开始,你可以像调用任何其他本地模块一样简单地调用x
的模块。如果
x
在不同的节点中,那么是的,使用 therpc
module to call into it is one viable option. As long as they
node can connect to thex
node via Distributed Erlang,rpc
无需任何额外设置即可工作。
我提到 API 因为通常情况下模块通过将它们的进程 ID 注册到某种名称注册表中来完成它们的工作,例如通过 erlang:register/2
, the global registry, or alternative registries such as gproc, and callers may need to first access the registry directly or indirectly to find the target they're trying to call. For example, when calling a gen_server
instance 的本地注册表你通常需要将您尝试调用的实例的名称或 pid 作为参数传递,对于远程调用,还需要目标节点名称。