Erlang 如何使用';它已经从一个模块运行了吗?

Erlang 如何使用';它已经从一个模块运行了吗?,erlang,otp,erlang-shell,Erlang,Otp,Erlang Shell,我昨天问了一个关于在另一个应用程序中使用一个应用程序的问题。 假设我想在新模块y中使用名为x的应用程序 x已经编译,为了简单起见,假设它已经在本地主机上运行,目标是在不同的节点上运行这两个组件 如何从y中调用x的函数? 类似于rpc:call(Node,x,Fun,Param) 此外,使用rpc模块是否需要任何(网络)设置 重要 如果无法测试两个节点之间的连接,请确保使用命令行标志-name,并且在net\u adm:ping/1调用中包含整个名称。e、 g.如果您将节点命名为x@localho

我昨天问了一个关于在另一个应用程序中使用一个应用程序的问题。
假设我想在新模块
y
中使用名为
x
的应用程序
x
已经编译,为了简单起见,假设它已经在本地主机上运行,目标是在不同的节点上运行这两个组件

如何从
y
中调用
x
的函数?
类似于
rpc:call(Node,x,Fun,Param)

此外,使用
rpc
模块是否需要任何(网络)设置

重要


如果无法测试两个节点之间的连接,请确保使用命令行标志
-name
,并且在
net\u adm:ping/1
调用中包含整个名称。e、 g.如果您将节点命名为
x@localhost
,您必须通过执行
net\u adm(
)从另一个模块ping
x
x@localhost)。。注意单引号。有关更多详细信息,请参阅。

如何调用
x
取决于其API以及
x
是否与
y
在同一节点上运行

  • 如果
    x
    y
    在同一节点上运行,并且您的应用程序依赖项被声明为
    x
    y
    启动之前启动,那么您可以简单地调用
    x
    的模块,就像调用任何其他本地模块一样

  • 如果
    x
    位于不同的节点中,则是,使用调用它是一个可行的选项。只要
    y
    节点可以通过连接到
    x
    节点,
    rpc
    将在无需任何额外设置的情况下工作


我之所以提到API,是因为通常情况下,模块通过将其进程ID注册到某种名称注册中心(例如通过本地注册中心)或其他注册中心(例如,和)来完成工作,调用者可能需要首先直接或间接访问注册中心,以找到他们试图调用的目标。例如,在调用时,通常需要将尝试调用的实例的名称或pid作为参数传递,对于远程调用,还需要目标节点名称。

谢谢!!节点应该是不同的,我忘了提到这一点。无论您的答案有多有用,我都试图通过使用
erl-name启动一个新shell来连接到
x
节点y@127.0.0.1-setcookie y
。我尝试使用
net\u adm:ping(x)ping
x
但它的响应是
pang
。你知道我可能做错了什么吗?
x
节点的名称是什么?如果在
x
节点上打开了一个Erlang shell,那么它的名称应该在shell提示符中。
x
是以短名称(使用
-sname
)还是长名称(使用
-name
)开头的?你确定它用的是同一块饼干吗?如果运行
epmd-names
它是否列出
x
节点?只是猜测一下,但我怀疑
127.0.0.1
部分应该是主机名。在
x
上运行
node()x@127.0.0.1
。这就是为什么我命名为
y
y@127.0.0.1
。我相信两者都使用长名称(
-name
),而不是短名称。我通过在控制台上运行
erlang:get_cookie()
x
获取cookie,该控制台输出
x
。因此,我用
erl-name开始
y
y@127.0.0.1-setcookie x
,但结果保持不变。同样让我感兴趣的是运行
net\u adm:names()
输出
{ok,[{“x”,58521},{“y”,58920}]}
epmd-names
在端口58920输出
名称y,在端口58521输出
名称x。我找到了答案。我必须使用
net\u adm:ping()x@127.0.0.1)。
。我以为
net\u adm:ping(x)。
就足够了,但显然不行!我是从你那里得到这个主意的。如果你很快来里斯本,我会给你买一杯啤酒。再次感谢你的帮助。你太棒了。