5

通常、Erlangプロセスのタイムアウトが必要な場合は、次の構成を使用します。

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

gen_fsmなどのOTPサーバーに同様のメカニズムがありますか?アプリケーションとのアクティブなセッションごとにgen_fsmを生成し、メッセージの受信後に非アクティブのタイムアウト値を超えた場合にそれらを終了させたいと考えています。

必要に応じて独自のカスタムプロセスを作成できますが、可能であればgen_fsmを使用することをお勧めします。

4

1 に答える 1

11

もう少し掘り下げて、自分の質問に対する答えを見つけました。

メッセージハンドラ「結果」には、タイムアウトであるオプションの4番目の引数を使用できます。

それで:

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が呼び出されると、5000msのタイムアウトで「another_fsm_state」の次の状態に遷移します。5000ms以内に新しいメッセージが受信されない場合、another_fsm_state(timeout、State)が呼び出されます。

賢いO​​TPプログラマー。:)

結果タプルのこの4番目の要素は休止状態である可能性があることに注意してください。詳細については、Erlangのドキュメントを参照してください。

Erlang-休止状態

gen_fsmドキュメント

于 2010-02-24T05:32:01.587 に答える