Gen_Fsm और Gen_Server दस्तावेज़ों की जांच करने के बाद, मैंने पाया कि, कम या ज्यादा, वे समान व्यवहार के रूप में कार्य करते हैं। मेरी राय में, यदि प्रसारण भेजने या टीसीपी सॉक सुनने के लिए एक लूप फ़ंक्शन है, तो gen_ssver का उपयोग करने के लिए Gen_Fsm का उपयोग करना बेहतर है। मैं जानना चाहता हूं कि यह सही है या नहीं?जब Gen_Fsm का उपयोग करें और Gen_Server का उपयोग कब करें?
उत्तर
आपने सही देखा है कि gen_server
और gen_fsm
कार्यक्षमता में बहुत समान हैं।
हालांकि अधिकांश कार्यक्रमों में gen_server
gen_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 की अनुशंसा करता हूं।
आपने कहा: "... आप चुनिंदा प्राप्तकर्ता का उपयोग नहीं कर सकते हैं।", वह क्यों है? मुझे लगता है कि जब तक हम उन संदेशों को स्पर्श नहीं करते हैं, हमें रुचि नहीं है, जैसे '$ gen_blah_blah' और सिस्टम संदेश, हम ठीक हैं। अगर हम आने वाले संदेश के प्रारूप को नियंत्रित कर सकते हैं, तो हम केवल उन लोगों को प्राप्त कर सकते हैं, जिनमें हमें रुचि है, जैसे कि {some_app_specific_message_tag, Msg} -> ... ' –
@NotanID अच्छी तरह से आपको चुनिंदा स्वयं को 'handle_info' में प्राप्त करना होगा , और 'gen_server: call | cast' का उपयोग करने में सक्षम नहीं होंगे। इस बिंदु पर, plain_fsm एक बेहतर विकल्प है। – niahoo