Разрешение gen_fsm на тайм-аут, если он не получает сообщений

Обычно, если я хочу иметь тайм-аут процесса Erlang, я бы использовал следующую конструкцию:

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

Есть ли аналогичный механизм в OTP-серверах, таких как gen_fsm? Я буду создавать gen_fsm для каждого активного сеанса с моим приложением и хотел бы, чтобы они завершались, если значение тайм-аута для бездействия превышено после получения сообщения.

Я могу написать свой собственный процесс, если это необходимо, но предпочел бы использовать gen_fsm, если это возможно.


person Jeff Thompson    schedule 24.02.2010    source источник


Ответы (1)


Покопался еще и нашел ответ на свой вопрос.

В обработчике сообщений «Результат» есть необязательный четвертый аргумент, который вы можете использовать, это тайм-аут.

so:

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 мс. Если новое сообщение не получено в течение 5000 мс, то вызывается another_fsm_state(timeout, State).

Умные программисты OTP. :)

Следует отметить, что этот четвертый элемент кортежа результатов может находиться в спящем режиме. Дополнительную информацию см. в документации по Erlang.

Erlang — Hibernate

документы gen_fsm

person Jeff Thompson    schedule 24.02.2010
comment
Также вы можете установить начальный тайм-аут, если вы передадите опцию {timeout, Time} при вызове start. - person Zed; 24.02.2010