如果远程节点上没有注册的处理过的消息(名称为Name),则分布式消息(例如,{Name,Node})如何成功?

问题描述 投票:0回答:1

根据《 Erlang参考手册》,the send operator (!)语法为Expr1 ! Expr2。它指出

  • Expr1可以是{Name, Node}形式的元组,其中“ Name是原子,Node是节点名称,也是原子”,和
  • 发送[...]的分布式消息永远不会失败”。

[将FreeSWITCHmod_erlang_event一起使用(这会启动一个Erlang C节点),并且发送带有任何原子作为mod_erlang_event的消息,将导致响应:

我理解“成功”表示“未崩溃”或“未返回错误”,而不是“将返回消息”。

Name

为什么在下面的两个常规Erlang节点上不起作用?

上面的原子也不是注册的过程,消息发送就像远程过程调用。

偷看了$ erl -sname test -setcookie ClueCon Erlang/OTP 19 [erts-8.2.1] [source] [64-bit] [async-threads:10] [kernel-poll:false] Eshell V8.2.1 (abort with ^G) (test@tr2)1> {polgarjenohivatalba, freeswitch@tr2} ! {api, msleep, 500}. {api,msleep,500} (test@tr2)2> receive X -> X after 1000 -> to end. {ok,"+OK"} (test@tr2)3> {vizbolveszikiazoxigent, freeswitch@tr2} ! holafafonok. holafafonok (test@tr2)4> flush(). Shell got {error,undef} (test@tr2)5> nodes(). [] (test@tr2)6> nodes(connected). [freeswitch@tr2] mod_erlang_event,但是我没有太多的C经验,也没有使用过非本地的Erlang节点。感觉好像运行一个C节点会导致(1)运行一个Erlang节点(2)具有进程自动启动(使用C逻辑作为该进程的mod_erlang_event循环)(3)将匹配任何原子。

所以也许这就是为什么只有显式注册的进程才能与本机Erlang节点一起使用的原因。 (再次,我可能完全错了。)

起始节点“ def”:

source

回到节点“ abc”开始较早:

receive

$ erl -sname def -setcookie lofa Erlang/OTP 19 [erts-8.2.1] [source] [64-bit] [async-threads:10] [kernel-poll:false] Eshell V8.2.1 (abort with ^G) (def@tr2)1> {lofa, abc@tr2} ! miez. miez (def@tr2)2> nodes(connected). [abc@tr2] $ erl -sname abc -setcookie lofa Erlang/OTP 19 [erts-8.2.1] [source] [64-bit] [async-threads:10] [kernel-poll:false] Eshell V8.2.1 (abort with ^G) (abc@tr2)1> receive X -> X after 27000 -> timeout end. timeout (abc@tr2)2> nodes(connected). [def@tr2] 也立即作为隐藏节点连接,但是此行为似乎与freeswitch@tr2test@tr2相同。

erlang freeswitch cnode
1个回答
0
投票

[发送”消息“成功”(即未引发错误)与“获取响应消息”之间有区别。在我看来,在一种情况下,发送的消息成功并返回了一条消息。在另一种情况下,发送的消息成功,并且不返回任何消息。

© www.soinside.com 2019 - 2024. All rights reserved.