2012-11-26 12 views
9

मैं बाल प्रक्रियाओं की निगरानी और पुनरारंभ करने के लिए ओटीपी पर्यवेक्षक व्यवहार का उपयोग कर रहा हूं। हालांकि जब बच्चा मर जाता है तो मैं उसे उसी स्थिति के साथ पुनरारंभ करना चाहता हूं जो दुर्घटना से पहले था।Erlang OTP पर्यवेक्षक व्यवहार का उपयोग कर कस्टम स्थिति के साथ बच्चे को पुनरारंभ कैसे करें?

यदि मैं अपना खुद का कस्टम पर्यवेक्षक लिखता हूं, तो मैं केवल {EXIT, Pid, ​​कारण} संदेश प्राप्त कर सकता हूं और उस पर कार्य कर सकता हूं। ओटीपी पर्यवेक्षक व्यवहार का उपयोग करते समय हालांकि यह सभी ओटीपी द्वारा प्रबंधित किया जाता है और मेरे पास इसका कोई नियंत्रण नहीं है। मैं लागू एकमात्र कॉलबैक फ़ंक्शन init है।

क्या इस तरह के मामले में कोई मानक दृष्टिकोण है? ओटीपी पर्यवेक्षक द्वारा गतिशील रूप से पुनरारंभ किए जाने वाले बच्चे की स्थिति को कैसे अनुकूलित करें? ओटीपी का उपयोग कर टर्मिनिंग प्रक्रिया की पिड कैसे प्राप्त करें? या शायद समाप्त होने से ठीक पहले बच्चे की स्थिति प्राप्त करना संभव है, और उसके बाद बच्चे को उसी स्थिति में बहाल करना चाहिए जो इससे पहले दुर्घटनाग्रस्त हो गया था?

+0

संभावित डुप्लिकेट [एरलांग प्रक्रिया को पुनरारंभ करना और संरक्षित राज्य] (http://stackoverflow.com/questions/13199528/restarting-erlang-process-and-preserving-state) –

उत्तर

0
तुम क्या कर रहे बारे में कोई विवरण बिना जाने

, मैं कहाँ निम्नलिखित समझ में आता है एक दुनिया की कल्पना कर सकते हैं:

  1. पर्यवेक्षक एक ईटीएस तालिका बनाता है और प्रत्येक बच्चे
  2. एक बच्चे को मेज पहचानकर्ता गुजरता प्रक्रिया शुरू होता है और, बच्चे के कुछ प्रासंगिक विशेषता के आधार पर, ईटीएस तालिका राज्य देखने के लिए सलाह भी लेता है
  3. हर बार एक बच्चे के राज्य यह ईटीएस तालिका
करने के लिए इसे लिखते हैं बदलता है लोड करने के लिए

तो, अगर मेरे पास कोबोल के 12 जनजातियों का प्रतिनिधित्व करने वाली 12 बाल प्रक्रियाएं थीं तो प्रत्येक ईटीएस तालिका की कुंजी के रूप में इसका नाम उपयोग करने के लिए पिछले अवतार द्वारा छोड़े गए राज्य को देखने के लिए उपयोग करेगा। और जब भी इसकी स्थिति बदल जाती है, तो प्रत्येक प्रक्रिया तालिका (फिर से इसके नाम का उपयोग करके कुंजी के रूप में) अपडेट करेगी।

पर्यवेक्षक स्वचालित रूप से एक मारे गए बच्चे को फिर से शुरू कर देगा और ऊपर चरण 2, बच्चे की init विधि में निष्पादित किया जाएगा। चरण 3 को बच्चे के हैंडल_call, handle_cast और handle_info विधियों में निपटाया जाएगा (मैं आपकी प्रक्रियाओं की प्रकृति के बारे में कुछ धारणाएं कर रहा हूं)। पर्यवेक्षक के माध्यम से कई पुनरारंभ रणनीतियां उपलब्ध हैं जो वांछित होने पर भाई बहन को फिर से शुरू कर सकती हैं।

आशा है कि यह आपको कुछ विचार देता है।

2

संभावित रूप से उसी राज्य के साथ पुनरारंभ करना अच्छा विचार नहीं है। शायद गलत स्थिति लीड प्रक्रिया क्रैश करने के लिए और यदि आप एक ही राज्य के साथ पुनरारंभ करते हैं, तो यह फिर से दुर्घटनाग्रस्त हो जाएगा। लेकिन यदि आप इसे चाहते हैं, तो इसे रखने के लिए बाहरी संसाधन का उपयोग करें (जैसे नेट या मैनेशिया)।

0

मुझे लगता है कि ओटीपी पर्यवेक्षक व्यवहार के इस प्रकार के अनुकूलन आसानी से नहीं किए जा सकते हैं। जिस तरह ओटीपी पर्यवेक्षकों को डिजाइन किया गया है, वे मुझे कुछ सख्त डिजाइन प्रथाओं का पालन करने के लिए मजबूर करते हैं। इस मामले में सबसे महत्वपूर्ण बात यह है कि पर्यवेक्षक को अपने बच्चों की निगरानी करने और असामान्य समाप्ति के मामले में उन्हें पुनरारंभ करने के अलावा कुछ भी नहीं करना चाहिए। पर्यवेक्षकों में पर्यवेक्षकों में कोई भी बग पेश नहीं करने के लिए पर्यवेक्षक में कोई अतिरिक्त तर्क नहीं होना चाहिए जो पर्यवेक्षण वृक्ष और गलती सहनशीलता का महत्वपूर्ण हिस्सा हैं।

जब बच्चा मर जाता है मैं एक ही राज्य में यह दुर्घटना से पहले था के साथ उसे पुन: प्रारंभ करना चाहते हैं - यह सामान्य रूप में बुरा व्यवहार है, क्योंकि बच्चे क्योंकि भ्रष्ट राज्य यह समाप्ति और यह पुन: प्रारंभ करने से पहले था की मृत्यु हो गई गए हैं हो सकता है इस तरह के मामले में एक ही राज्य के साथ निश्चित रूप से समस्याएं पैदा होंगी

क्या इस तरह के मामले में कोई मानक दृष्टिकोण है? पर्यवेक्षक के भीतर बच्चों की स्थिति को अनुकूलित करना, उन्हें पुनरारंभ करने से पहले पर्यवेक्षक अच्छे डिजाइन प्रथाओं के खिलाफ कार्य करता है। इसलिए इस प्रकार के कार्यों को आम तौर पर अलग किया जाता है, उदाहरण के लिए एक और प्रक्रिया शुरू करके, उदाहरण के लिए gen_server जो पर्यवेक्षक (पर्यवेक्षक: start_child) के माध्यम से बच्चों को शुरू करने और सभी प्रक्रियाओं पर मॉनीटर बनाए रखने के लिए जिम्मेदार होगा। यह अतिरिक्त प्रक्रिया नए बच्चे को शुरू करने से पहले किसी भी आवश्यक अनुकूलन कर सकती है।

ओटीपी का उपयोग कर समाप्ति प्रक्रिया का पिड कैसे प्राप्त करें? - अतिरिक्त प्रक्रिया में जो पर्यवेक्षक के माध्यम से बच्चों को शुरू करता है: start_child आप उनकी निगरानी कर सकते हैं और फिर नीचे संदेशों को सुन सकते हैं।

handle_info({'DOWN', Ref, process, _Pid, _}, S) -> 
    handle_down_worker(Ref, _Pid, S). 

या हो सकता है यह संभव है बस समाप्ति से पहले बच्चे का राज्य प्राप्त करने के लिए, और फिर एक ही राज्य से यह पहले था के लिए बच्चे को बहाल: मामले में उदाहरण gen_server की आप नीचे के रूप में handle_info समारोह का प्रयोग करेंगे के लिए दुर्घटनाग्रस्त हो गया? - अगर मैं गलत हूं तो मुझे सही करें लेकिन मुझे लगता है कि 'डाउन' संदेश के साथ, एरलांग को भेजने की प्रक्रिया में राज्य की प्रक्रिया की स्थिति, बच्चे की प्रक्रिया के साथ, संभवतः समाप्ति से पहले संभव नहीं है। यदि यह संभव होगा तो मैं केवल {डाउन, पिड, कारण, राज्य} के समान संदेश संभाल सकता हूं और उसी स्थिति या उसके हिस्से के साथ प्रक्रिया को पुनरारंभ कर सकता हूं। लेकिन फिर, मैं सोच रहा हूं .. आप अचानक मरने वाले बच्चे की स्थिति को कैसे संरक्षित कर सकते हैं, उदाहरण के लिए निकास (पिड, मार) के साथ मारा गया था? मुझे संदेह है कि यह संभव होगा।

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