Pergunta

Normalmente, se eu gostaria de ter um tempo limite do processo Erlang, eu usaria o seguinte construto:

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

Existe um mecanismo semelhante nos servidores OTP, como o Gen_FSM? Estarei gerando GEN_FSM para cada sessão ativa com meu aplicativo e gostaria de sair se um valor de tempo limite para inatividade for excedido após o recebimento de uma mensagem.

Posso escrever meu próprio processo personalizado, se necessário, mas preferiria usar um Gen_FSM, se possível.

Foi útil?

Solução

Eu cavei um pouco mais e encontrei a resposta para minha própria pergunta.

Há um quarto argumento opcional no manipulador de mensagens "resultados" que você pode usar, que é um tempo limite.

assim:

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.

Depois que o Some_fsm_state é chamado, ele transita para o próximo estado de "outro_fsm_state" com um tempo limite de 5000ms. Se não for uma nova mensagem é recebida dentro de 5000ms, outro_fsm_state (tempo limite, estado) é chamado.

Programadores OTP inteligentes. :)

Deve -se notar que esse quarto elemento nos resultados Tuple pode ser hibernado. Consulte a documentação do Erlang para obter mais informações.

Erlang - Hibernate

Docs gen_fsm

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top