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
以外の種類のメッセージを受信した場合に使用されます。call
cast
call
使用するかどうかを決定するにcast
は、「送信者はこの種のメッセージの応答を待ちたいですか?」という質問をする必要があると思います。はいの場合call
は同期を使用し、いいえの場合cast
は非同期を使用します。
しかし、Erlang を使用してからしばらく経ちました。