2010-02-24 3 views
5

Normalement, si je voudrais avoir un délai d'attente de processus Erlang j'utiliser la construction suivante:Permettre à un gen_fsm de délai d'attente si elle ne reçoit pas de messages

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

Y at-il un mécanisme similaire dans les serveurs OTP tels que gen_fsm? Je vais engendrer gen_fsm pour chaque session active avec mon application, et je voudrais les faire sortir si une valeur de délai d'inactivité est dépassée après avoir reçu un message.

Je peux écrire mon propre processus personnalisé si nécessaire, mais je préférerais utiliser un gen_fsm si possible.

Répondre

11

J'ai creusé un peu plus et trouvé la réponse à ma propre question.

Il existe un quatrième argument facultatif dans le gestionnaire de messages "Résultat" que vous pouvez utiliser, lequel est un délai d'expiration.

donc:

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. 

Une fois some_fsm_state est appelée, elle transition vers l'étape suivante de "another_fsm_state" avec un délai d'attente de 5000ms. Si un nouveau message n'est pas reçu dans les 5000 ms, alors un autre état (timeout, état) est appelé.

Programmeurs OTP intelligents. :)

Il est à noter que ce quatrième élément du tuple Résultats peut être hiberné. Veuillez consulter la documentation d'Erlang pour plus d'informations.

Erlang - Hibernate

gen_fsm docs

+3

vous pouvez également définir le délai initial, si vous passez une option '{délai d'attente, temps}' lorsque vous appelez début. – Zed

+0

Excellent, merci Zed! –

Questions connexes