写代码时,我会问自己应该使用call
哪种类型的消息,应该使用哪种类型的消息info
?
在这个问题下面,还有一个长期以来的疑问,info, cast, call
消息之间是否存在优先级差异?这 3 种类型的消息是否共享同一个队列?
写代码时,我会问自己应该使用call
哪种类型的消息,应该使用哪种类型的消息info
?
在这个问题下面,还有一个长期以来的疑问,info, cast, call
消息之间是否存在优先级差异?这 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 调用。
例如 timeout、tcp、udp、EXIT、sytem info 和许多其他不适合 handle_call 或 handle_cast 的内容。
你的意思是什么时候使用call
,什么时候使用cast
?info
用于超时或服务器接收到其他类型的消息call
时。cast
要决定是否使用call
或cast
我认为您应该问“发件人是否要等待此类消息的答案?”这个问题。如果是call
,则使用同步,如果不使用cast
,则使用异步。
但是我已经有一段时间没有使用 Erlang 了。