2010-02-24 27 views
5

一般來說,如果我想有一個Erlang進程超時,我會用下面的結構:允許一個的gen_fsm超時如果它收到任何消息

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

有沒有在OTP服務器,如類似的機制的gen_fsm?我將爲我的應用程序的每個活動會話產生gen_fsm,並且如果在收到消息後超出非活動狀態的超時值,他們希望它們退出。

如果需要,我可以編寫自己的自定義過程,但如果可能的話,寧願使用gen_fsm。

回答

11

我挖了一些,找到了我自己的問題的答案。

消息處理程序「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毫秒的超時。如果在5000ms內沒有收到新消息,則調用another_fsm_state(timeout,State)。

聰明的OTP程序員。 :)

應該指出,結果元組中的第四個元素可以是hibernate。請參閱Erlang文檔以獲取更多信息。

Erlang - Hibernate

gen_fsm docs

+3

您也可以設置初始超時,如果你調用start時傳遞'{超時,時間}'選項。 – Zed 2010-02-24 07:06:07

+0

非常好,謝謝Zed! – 2010-02-24 22:22:26

相關問題