在編寫代碼時,我問自己應該使用哪種類型的消息call
,應該使用哪種類型的消息info
?otp gen_server的info,call,cast消息隊列有不同的優先級嗎?
在這個問題下面,還有另一個長期懷疑info, cast, call
消息之間是否有優先權區別?這三種消息是否共享相同的隊列?
在編寫代碼時,我問自己應該使用哪種類型的消息call
,應該使用哪種類型的消息info
?otp gen_server的info,call,cast消息隊列有不同的優先級嗎?
在這個問題下面,還有另一個長期懷疑info, cast, call
消息之間是否有優先權區別?這三種消息是否共享相同的隊列?
消息的優先級是相同的。快速查看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以來已經有一段時間了。