Обычно, если бы я хотел бы сделать, чтобы Erlang обработал тайм-аут, я использовал бы следующую конструкцию:
receive
Msg -> ok; %% handle message
after 60000 ->
%% Handle timeout and exit
end.
Существует ли подобный механизм в серверах OTP, таких как gen_fsm? Я буду порождать gen_fsm для каждой активной сессии с моим приложением и хотел бы сделать, чтобы они вышли, если значение тайм-аута для неактивности будет превышено после получения сообщения.
Я могу записать свой собственный процесс если потребуется, но предпочел бы использовать gen_fsm, если это возможно.
Я откопал еще немного и нашел ответ на свой вопрос.
В обработчике сообщений 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.