13

私は問題に取り組んでいて、以前のプログラマーが PID の標準規則を使用してメッセージを渡しているコードに気付きました! メッセージ。私は gen_server:cast/2 を使用しています。この2つを選択する際の重要な違いと考慮事項を誰かが私に説明できるかどうか疑問に思っていましたか?

4

2 に答える 2

19

いくつかの小さな違いがあります:

  • 明らかに、gen_server は のキャストhandle_castと「通常の」メッセージを処理しhandle_infoます。
  • キャストが失敗することはありません。常に戻りますok。現在プロセスによって登録されていないアトムにメッセージを送信している場合、 でのメッセージの送信は!失敗します。badarg(プロセスが停止していても、pid にメッセージを送信してもエラーは発生しません。)
  • gen_server が現在ローカル ノードに接続されていないリモート ノードで実行されている場合、gen_server:castバックグラウンド プロセスを生成して接続を確立し、メッセージを送信してすぐに!戻りますが、接続が確立された場合にのみ戻ります。( のコードを参照してくださいgen_server:do_send。)

いつどちらを選択するかについては、ほとんどが好みの問題です。メッセージが gen_server の非同期 API 関数と考えることができる場合、キャストを使用、gen_server コールバック モジュールに特定の API 関数を含める必要があります。つまり、gen_server:cast直接呼び出す代わりに、次のようにします。

gen_server:cast(foo_proc, {some_message, 42})

関数呼び出しを行います:

foo_proc:some_message(42)

上記の直接キャストのようにその機能を実装します。これにより、独自のモジュール内に gen_server の特定のプロトコルがカプセル化されます。

私の考えでは、API 呼び出しではなく、「プレーンな」メッセージがイベントに使用されます。例としては{'DOWN', Ref, process, Id, Reason}、システムで発生する可能性のある監視メッセージ、 、および同様の種類のイベントがあります。

于 2014-04-09T16:52:08.860 に答える
6

legoscia の投稿に加えて、メッセージよりも専用関数 API をトレースする方が簡単だと思います。特にprod環境では。

于 2014-04-09T18:14:41.037 に答える