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

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

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

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

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

5
задан Jeff Thompson 24 February 2010 в 05:01
поделиться

1 ответ

Я откопал еще немного и нашел ответ на свой вопрос.

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

итак:

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 docs

11
ответ дан 13 December 2019 в 19:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: