2011-06-01 8 views
10

Gen_Fsm और Gen_Server दस्तावेज़ों की जांच करने के बाद, मैंने पाया कि, कम या ज्यादा, वे समान व्यवहार के रूप में कार्य करते हैं। मेरी राय में, यदि प्रसारण भेजने या टीसीपी सॉक सुनने के लिए एक लूप फ़ंक्शन है, तो gen_ssver का उपयोग करने के लिए Gen_Fsm का उपयोग करना बेहतर है। मैं जानना चाहता हूं कि यह सही है या नहीं?जब Gen_Fsm का उपयोग करें और Gen_Server का उपयोग कब करें?

उत्तर

9

आपने सही देखा है कि gen_server और gen_fsm कार्यक्षमता में बहुत समान हैं।

हालांकि अधिकांश कार्यक्रमों में gen_servergen_fsm उपयोग से अधिक gen_server है।

मेरी राय में gen_fsm केवल तभी उपयोगी होता है जब उपयोग 100% gen_fsm मॉडल फिट बैठता है। इसलिए आपकी समस्या के अनुरूप फिट एक सरल और स्पष्ट परिमित राज्य मशीन होनी चाहिए। ध्यान रखें कि आमतौर पर एफएसएम की राज्य गिनती असली दुनिया के चेहरे पर विस्फोट करती है।

आप पाते हैं अपने आप को 'gen_server करने के लिए स्विच और gen_fsm जोड़ने के लिए रों State चर इसकी शायद समय' State चर करने के लिए राज्य gen_fsm में माध्यमिक राज्य में बहुत सारी जानकारी होने हैं।

आम तौर पर जब संदेह में: का उपयोग gen_server और gen_fsm दोनों की gen_server

एक नुकसान यह है (जो आमतौर पर gen_fsm में बदतर बाहर आता है) आप चयनात्मक उपयोग नहीं कर सकते प्राप्त करते हैं। चुनिंदा प्राप्त वास्तविक दुनिया अनुप्रयोगों में राज्य मशीन जटिलता को कम करने के लिए एक महत्वपूर्ण उपकरण है।

चुनिंदा प्राप्त करने और ओटीपी व्यवहार दोनों का लाभ उठाने के लिए मैं plain_fsm की अनुशंसा करता हूं।

+0

आपने कहा: "... आप चुनिंदा प्राप्तकर्ता का उपयोग नहीं कर सकते हैं।", वह क्यों है? मुझे लगता है कि जब तक हम उन संदेशों को स्पर्श नहीं करते हैं, हमें रुचि नहीं है, जैसे '$ gen_blah_blah' और सिस्टम संदेश, हम ठीक हैं। अगर हम आने वाले संदेश के प्रारूप को नियंत्रित कर सकते हैं, तो हम केवल उन लोगों को प्राप्त कर सकते हैं, जिनमें हमें रुचि है, जैसे कि {some_app_specific_message_tag, Msg} -> ... ' –

+0

@NotanID अच्छी तरह से आपको चुनिंदा स्वयं को 'handle_info' में प्राप्त करना होगा , और 'gen_server: call | cast' का उपयोग करने में सक्षम नहीं होंगे। इस बिंदु पर, plain_fsm एक बेहतर विकल्प है। – niahoo

संबंधित मुद्दे