gpt4 book ai didi

erlang - 如果 gen_fsm 没有收到消息,则允许它超时

转载 作者:行者123 更新时间:2023-12-04 17:13:40 24 4
gpt4 key购买 nike

通常,如果我想要 Erlang 进程超时,我会使用以下构造:

receive 
Msg -> ok; %% handle message
after 60000 ->
%% Handle timeout and exit
end.

OTP 服务器中是否有类似的机制,例如 gen_fsm?我将为我的应用程序的每个事件 session 生成 gen_fsm,如果在收到消息后超过非事件超时值,我希望它们退出。

如果需要,我可以编写自己的自定义流程,但如果可能,我更愿意使用 gen_fsm。

最佳答案

我又挖了一些,找到了我自己问题的答案。

在消息处理程序“结果”中有一个可选的第四个参数,您可以使用它是超时。

所以:

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 程序员。 :)

应该注意的是,结果元组中的第四个元素可以是休眠的。请参阅 Erlang 文档了解更多信息。

Erlang - Hibernate

gen_fsm docs

关于erlang - 如果 gen_fsm 没有收到消息,则允许它超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2323782/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com