السماح لـ gen_fsm بالمدة إذا لم يتلق أي رسائل

StackOverflow https://stackoverflow.com/questions/2323782

  •  22-09-2019
  •  | 
  •  

سؤال

عادة إذا كنت أرغب في الحصول على مهلة عملية Erlang ، فسأستخدم البناء التالي:

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

هل هناك آلية مماثلة في خوادم OTP مثل Gen_FSM؟ سأقوم بتفريغ Gen_FSM لكل جلسة نشطة مع طلبي ، وأرغب في الخروج منها إذا تم تجاوز قيمة المهلة مقابل عدم النشاط بعد تلقي رسالة.

يمكنني كتابة عمليتي المخصصة إذا لزم الأمر ، لكنني أفضل استخدام Gen_FSM إن أمكن.

هل كانت مفيدة؟

المحلول

لقد حفرت أكثر ووجدت إجابة على سؤالي.

هناك وسيطة رابعة اختيارية في "نتيجة" معالج الرسائل "يمكنك استخدامها وهي مهلة.

لذا:

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 ، فإنه ينتقل إلى الحالة التالية من "other_fsm_state" مع مهلة 5000 مللي ثانية. إذا لم يتم استلام رسالة جديدة في 5000 مللي ثانية ، يتم استدعاء other_fsm_state (المهلة ، الحالة).

مبرمجي OTP ذكي. قون

تجدر الإشارة إلى أن هذا العنصر الرابع في النتائج يمكن أن يكون tuple السبات. يرجى الاطلاع على وثائق Erlang لمزيد من المعلومات.

إرلانج - السبات

مستندات Gen_FSM

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top