2010-02-24 9 views
5

आम तौर पर प्राप्त करता है एक gen_fsm समयबाह्य करने की अगर मैं एक Erlang प्रक्रिया टाइमआउट मैं निम्नलिखित निर्माण का प्रयोग करेंगे करना चाहते हैं:की अनुमति दे अगर यह कोई संदेश

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

वहाँ इस तरह के रूप OTP सर्वर में एक ऐसी ही व्यवस्था है gen_fsm? मैं अपने आवेदन के साथ प्रत्येक सक्रिय सत्र के लिए gen_fsm को स्पॉन्ग कर दूंगा, और संदेश प्राप्त करने के बाद निष्क्रियता के लिए टाइमआउट मान पार होने पर उन्हें बाहर निकलना चाहूंगा।

यदि आवश्यकता हो तो मैं अपनी खुद की कस्टम प्रक्रिया लिख ​​सकता हूं, लेकिन यदि संभव हो तो gen_fsm का उपयोग करना पसंद करूंगा।

उत्तर

11

मैंने कुछ और खोला और मुझे अपने प्रश्न का उत्तर मिला।

संदेश हैंडलर "परिणाम" में एक वैकल्पिक चौथा तर्क है जिसका उपयोग आप समय-समय पर कर सकते हैं।

तो:

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" के अगले राज्य के लिए 5000ms की एक समय समाप्ति के साथ बदलाव। यदि 5000ms के भीतर नया संदेश प्राप्त नहीं हुआ है, तो another_fsm_state (टाइमआउट, राज्य) कहा जाता है।

चालाक ओटीपी प्रोग्रामर। :)

यह ध्यान दिया जाना चाहिए कि परिणाम ट्यूपल में यह चौथा तत्व हाइबरनेट हो सकता है। अधिक जानकारी के लिए कृपया Erlang दस्तावेज़ीकरण देखें।

Erlang - Hibernate

gen_fsm docs

+3

इसके अलावा, आप, प्रारंभिक समाप्ति सेट अगर तुम जब शुरू बुला एक '{टाइमआउट, Time} को' विकल्प दे सकते हैं। – Zed

+0

बढ़िया, धन्यवाद ज़ेड! –