如何使用已从模块运行的OTP应用程序?

时间:2016-03-28 11:34:09

标签: erlang otp erlang-shell

昨天我问了similar question关于在另一个内部使用一个应用程序的问题 我们想说我想在新模块<div class="st-container"> <input type="radio" name="radio-set" checked="checked" id="st-control-1"/> <a href="#st-panel-1">Something</a> <input type="radio" name="radio-set" id="st-control-2"/> <a href="#st-panel-2">Happiness</a> <input type="radio" name="radio-set" id="st-control-3"/> <a href="#st-panel-3">Tranquillity</a> <input type="radio" name="radio-set" id="st-control-4"/> <a href="#st-panel-4">Positivity</a> <input type="radio" name="radio-set" id="st-control-5"/> <a href="#st-panel-5"> WebGear</a> <div class="st-scroll"> <section class="st-panel" id="st-panel-1"> <div class="st-deco" data-icon="H"></div> <div id="section1"> <div id="menu"> <img id="menuitem" src="Images/Menuitem.png"/> <div id="hlava"> <div id="flashContent"> Some content 1 </div> </div> </div> </div> </section> <section class="st-panel" id="st-panel-2"> <div class="st-deco" data-icon="H"></div> <div id="section1"> <div id="menu"> <img id="menuitem" src="Images/Menuitem.png"/> <div id="hlava"> <div id="flashContent"> Some content 2 </div> </div> </div> </div> </section> </div> </div>中使用名为x的应用程序。
y已经编译,为了简单起见,我们假设它已经在localhost上运行,目标是在不同的节点中运行这两个组件。

如何从x内调用x的功能?
y之类的东西会起作用吗?

此外,是否需要任何(网络)设置才能使用rpc:call(Node, x, Fun, Param)模块?

重要

如果您无法测试两个节点之间的连接,请确保使用命令行标记rpc,并在-name调用中包含全名。例如如果您为节点net_adm:ping/1命名,则必须通过执行x@localhost从另一个模块中ping x。注意单引号。有关详细信息,请参阅this question

1 个答案:

答案 0 :(得分:3)

如何致电x取决于其API以及x是否与y在同一节点中运行。

  • 如果xy在同一节点中运行,并且声明了应用程序依赖项,xy启动之前启动,则只需调用进入x模块,与调用任何其他本地模块相同。

  • 如果x位于不同的节点,那么是的,使用the rpc module来调用它是一个可行的选择。只要y节点可以通过Distributed Erlang连接到x节点,rpc就可以在不进行任何额外设置的情况下工作。

我提到了API,因为模块经常通过将其流程ID注册到某种名称注册表来完成工作,例如通过erlang:register/2the global registry注册本地注册表。或者gproc之类的其他注册表,并且呼叫者可能需要首先直接或间接访问注册表以找到他们尝试呼叫的目标。例如,在调用gen_server instance时,您通常需要将您尝试调用的实例的名称或pid作为参数传递,对于远程调用,还需要目标节点名称。 / p>