3

写代码时,我会问自己应该使用call哪种类型的消息,应该使用哪种类型的消息info

在这个问题下面,还有一个长期以来的疑问,info, cast, call消息之间是否存在优先级差异?这 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 调用。

例如 timeout、tcp、udp、EXIT、sytem info 和许多其他不适合 handle_call 或 handle_cast 的内容。

于 2012-05-21T11:24:04.990 回答
4

你的意思是什么时候使用call,什么时候使用castinfo用于超时或服务器接收到其他类型的消息call时。cast

要决定是否使用callcast我认为您应该问“发件人是否要等待此类消息的答案?”这个问题。如果是call,则使用同步,如果不使用cast,则使用异步。

但是我已经有一段时间没有使用 Erlang 了。

于 2012-05-21T11:36:33.397 回答