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(
)从另一个模块pingx
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)pingx
。
但它的响应是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)。
就足够了,但显然不行!我是从你那里得到这个主意的。如果你很快来里斯本,我会给你买一杯啤酒。再次感谢你的帮助。你太棒了。