5

Erlang User's Guideでは、 send 演算子について次のように説明されています。

8.9 送信

Expr1 ! Expr2

で指定されたプロセスにの値をExpr2メッセージとして送信します Expr1。の値Expr2は、式の戻り値でもあります。

Expr1pid登録名(atom)、またはtuple {Name,Node}に評価される必要があります。NameはアトムでNodeあり、ノード名でもあり、アトムでもあります。

  • Expr1が名前として評価されたが、この名前が登録されていない場合、実行badarg時エラーが発生します。
  • pid が存在しないプロセスを識別したとしても、pid へのメッセージの送信は決して失敗しません。
  • 分散メッセージ送信、つまりExpr1、タプル {Name,Node}(または別のノードにある pid) に評価される場合も、失敗することはありません。

分散メッセージ送信の場合{Name,Node}、リモート ノードまたはプロセスのコードから、最初のアトムが何を表しているのかが明確ではありません。

あなたの助けに感謝します。

4

3 に答える 3

7

あなたが引用している文の文法は少しあいまいです。3 つのオプションは次のとおりです。

  • 特定の Erlang 関数 (主に spawn と spawn_link) から返される不透明なデータ型であるプロセス ID。
  • ローカル ノード (つまり、ローカル VM) に登録された名前。これが必要になる例としては、プロセスが DNS キャッシュなどの主要なユーティリティ サービスと通信できるようにする、長時間実行されるサーバー アプリケーションがあります。
  • 登録された名前とそれが存在するノードの名前の両方を含むタプル (別の VM の場合、別のホスト上にある可能性があります)。

最初のものは断然最も一般的です。登録名は、慎重に使用することを目的としています。

Learn You Some Erlang の並行処理の章から始めて、必要に応じて前の章に戻ることをお勧めします: http://learnyousomeerlang.com/the-hitchhikers-guide-to-concurrency#dont-panic

于 2012-10-23T00:13:01.823 に答える
3

node1@localhost と node2@localhost の 2 つのノードがあり、erlang プロセスを node1 に process1 として登録するとします。

次のように、node2 から node1 の process1 にメッセージを送信できます。

{process1, node1@localhost} ! yourmessage.

これが役立つことを願っています

于 2012-10-23T12:48:09.103 に答える