callコードを書くとき、私はどのタイプのメッセージを使うべきか、どのタイプのメッセージを使うべきinfoかを自問します。
info, cast, callこの質問の下に、メッセージ間に優先順位の違いがあるかどうかというもう1つの長年の疑問がありますか?これらの3つのタイプのメッセージが同じキューを共有するかどうか。
callコードを書くとき、私はどのタイプのメッセージを使うべきか、どのタイプのメッセージを使うべきinfoかを自問します。
info, cast, callこの質問の下に、メッセージ間に優先順位の違いがあるかどうかというもう1つの長年の疑問がありますか?これらの3つのタイプのメッセージが同じキューを共有するかどうか。
メッセージの優先度は同じです。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 に適合しない多くのもの。
callいつ使用するか、いつ使用するかを意味しますcastか?は、タイムアウトの場合、またはサーバーがおよびinfo以外の種類のメッセージを受信した場合に使用されます。callcast
call使用するかどうかを決定するにcastは、「送信者はこの種のメッセージの応答を待ちたいですか?」という質問をする必要があると思います。はいの場合callは同期を使用し、いいえの場合castは非同期を使用します。
しかし、Erlang を使用してからしばらく経ちました。