السماح لـ gen_fsm بالمدة إذا لم يتلق أي رسائل
سؤال
عادة إذا كنت أرغب في الحصول على مهلة عملية 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 لمزيد من المعلومات.