3

callコードを書くとき、私はどのタイプのメッセージを使うべきか、どのタイプのメッセージを使うべきinfoかを自問します。

info, cast, callこの質問の下に、メッセージ間に優先順位の違いがあるかどうかというもう1つの長年の疑問がありますか?これらの3つのタイプのメッセージが同じキューを共有するかどうか。

4

2 に答える 2

7

メッセージの優先度は同じです。gen_server.erl を簡単に調べると、すべてのデータを受信する単純なループが見つかります。

loop(Parent, Name, State, Mod, hibernate, Debug) ->
    proc_lib:hibernate(?MODULE,wake_hib,[Parent, Name, State, Mod, Debug]);
loop(Parent, Name, State, Mod, Time, Debug) ->
    Msg = receive
          Input ->
            Input
      after Time ->
          timeout
      end,
    decode_msg(Msg, Parent, Name, State, Mod, Time, Debug, false).

handle_infoについて:

この関数は、タイムアウトが発生したとき、または同期または非同期要求 (またはシステム メッセージ) 以外のメッセージを受信したときに、gen_server によって呼び出されます。

たとえば、タイムアウト、tcp、udp、EXIT、システム情報など、handle_call または handle_cast に適合しない多くのもの。

于 2012-05-21T11:24:04.990 に答える
4

callいつ使用するか、いつ使用するかを意味しますcastか?は、タイムアウトの場合、またはサーバーがおよびinfo以外の種類のメッセージを受信した場合に使用されます。callcast

call使用するかどうかを決定するにcastは、「送信者はこの種のメッセージの応答を待ちたいですか?」という質問をする必要があると思います。はいの場合callは同期を使用し、いいえの場合castは非同期を使用します。

しかし、Erlang を使用してからしばらく経ちました。

于 2012-05-21T11:36:33.397 に答える