2010-02-24 7 views
5

Normalmente si me gustaría tener un tiempo de espera de proceso de Erlang me gustaría utilizar la construcción siguiente:gen_fsm de tiempo de espera si no recibe mensajes

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

¿Existe un mecanismo similar en los servidores como OTP gen_fsm? Estaré generando gen_fsm para cada sesión activa con mi aplicación, y me gustaría que salgan si se excede un valor de tiempo de inactividad después de recibir un mensaje.

Puedo escribir mi propio proceso personalizado si es necesario, pero preferiría usar un gen_fsm si fuera posible.

Respuesta

11

Cavé un poco más y encontré la respuesta a mi propia pregunta.

Hay un cuarto argumento opcional en el controlador de mensajes "Resultados" que puede usar, que es un tiempo de espera.

manera:

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. 

Una vez some_fsm_state se llama, se pasa al siguiente estado de "another_fsm_state" con un tiempo de espera de 5000 ms. Si no se recibe un mensaje nuevo dentro de los 5000 ms, se llamará a otro_fsm_state (tiempo de espera, estado).

Programadores OTP inteligentes. :)

Cabe señalar que este cuarto elemento en la tupla Resultados puede hibernar. Por favor, consulte la documentación de Erlang para más información.

Erlang - Hibernate

gen_fsm docs

+3

También se puede ajustar el tiempo de espera inicial, si se pasa un '{tiempo de espera, Tiempo}' opción cuando se llama a inicio. – Zed

+0

Excelente, gracias Zed! –

Cuestiones relacionadas