如果 gen_fsm 没有收到消息,则允许它超时
Posted
技术标签:
【中文标题】如果 gen_fsm 没有收到消息,则允许它超时【英文标题】:Allowing a gen_fsm to timeout if it receives no messages 【发布时间】:2011-01-20 09:28:16 【问题描述】:通常,如果我希望 Erlang 进程超时,我会使用以下构造:
receive
Msg -> ok; %% handle message
after 60000 ->
%% Handle timeout and exit
end.
在 gen_fsm 等 OTP 服务器中是否有类似的机制?我将为我的应用程序的每个活动会话生成 gen_fsm,如果在收到消息后超过非活动的超时值,我希望它们退出。
如果需要,我可以编写自己的自定义流程,但如果可能,我更愿意使用 gen_fsm。
【问题讨论】:
【参考方案1】:我又挖了一些,找到了我自己问题的答案。
消息处理程序“Result”中有一个可选的第四个参数,您可以使用它是超时。
所以:
some_fsm_state(set, Val, State) ->
NewState = do(Val, State),
next_state, another_fsm_state, NewState, 5000;
another_fsm_state(timeout, State) ->
handle_timeout(State).
another_fsm_state(set, Val, State) ->
%% more code that handles this state.
一旦调用了 some_fsm_state,它就会转换到“another_fsm_state”的下一个状态,超时时间为 5000 毫秒。如果 5000ms 内没有收到新消息,则调用 another_fsm_state(timeout, State)。
聪明的 OTP 程序员。 :)
需要注意的是,Results 元组中的第四个元素可以是休眠的。请参阅 Erlang 文档了解更多信息。
Erlang - Hibernate
gen_fsm docs
【讨论】:
你也可以设置初始超时,如果你在调用start时传递了timeout, Time
选项。以上是关于如果 gen_fsm 没有收到消息,则允许它超时的主要内容,如果未能解决你的问题,请参考以下文章
TCP Retransmission重新传送超过5次后还没收到回复会怎么办?
SSH超时断开(ClientAliveInterval和ClientAliveCountMax )的使用