2010-02-24 6 views
5

Normalmente se mi piacerebbe avere un timeout processo di Erlang Vorrei utilizzare il seguente costrutto:Permettere un gen_fsm al timeout se riceve nessun messaggio

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

Esiste un meccanismo simile nei server OTP, come gen_fsm? Genererò gen_fsm's per ogni sessione attiva con la mia applicazione, e vorrei che uscissero se un valore di timeout per inattività viene superato dopo aver ricevuto un messaggio.

Posso scrivere il mio processo personalizzato se necessario, ma preferirei usare un gen_fsm se possibile.

risposta

11

Ho scavato un po 'di più e ho trovato la risposta alla mia domanda.

C'è un quarto argomento opzionale nel gestore di messaggi "Risultato" che è possibile utilizzare quale è un timeout.

così:

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. 

volta some_fsm_state viene richiamato, transizione allo stato successivo "another_fsm_state" con un timeout di 5000 ms. Se non viene ricevuto un nuovo messaggio entro 5000 ms, viene chiamato another_fsm_state (timeout, State).

Programmatori OTP intelligenti. :)

Si noti che questo quarto elemento nella tupla Risultati può essere ibernato. Si prega di consultare la documentazione di Erlang per ulteriori informazioni.

Erlang - Hibernate

gen_fsm docs

+3

Inoltre è possibile impostare il timeout iniziale, se si passa una '{timeout, Tempo}' opzione al momento della chiamata di avvio. – Zed

+0

Eccellente, grazie Zed! –