Разрешение времени ожидания gen_fsm, если он не получает сообщений - PullRequest
5 голосов
/ 24 февраля 2010

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

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

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

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

1 Ответ

11 голосов
/ 24 февраля 2010

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

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

так:

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 (время ожидания, состояние).

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

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

Erlang - Hibernate

gen_fsm docs

...