2011-09-20 16 views
8

उत्तर दिया है मेरे पास एन कार्यकर्ता प्रक्रियाओं के साथ एक पर्यवेक्षक है। हमेशा के रूप में पर्यवेक्षक एक कार्यकर्ता प्रक्रिया को एक संदेश भेज सकता है और handle_cast है जो एक कर्मचारी से पर्यवेक्षक को उत्तर भेजता है।एरलांग पर्यवेक्षक: यह जांचने के लिए कि क्या सभी श्रमिकों ने

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

उत्तर

8

यदि आप एक ओटीपी supervisor के बारे में बात कर रहे हैं, तो आप इससे किसी कार्यकर्ता को कोई संदेश नहीं भेज सकते हैं। एक पर्यवेक्षक के प्रयोजन के शुरू करने, और को पुन: प्रारंभ प्रक्रियाओं रोक, निगरानी के साथ एक बहुत ही सीमित व्यवहार है। और कुछ नहीं।

इसलिए अपनी विशेष समस्या को हल करने के लिए, आपको एक ऐसी प्रक्रिया होगी जो सभी श्रमिकों को संदेश भेजने के लिए ज़िम्मेदार है। यह प्रक्रिया अपने राज्य के सभी श्रमिकों की एक सूची भी रख सकती है, जो प्रतिक्रिया दे चुके श्रमिकों ("सूची से हटाएं) (या सूची से हटा दें)। आप इसे पीआईडी ​​की एक सूची के साथ प्राप्त कर सकते हैं, और प्रक्रियाओं से प्रतिक्रिया प्राप्त कर सकते हैं (या erlang:monitor/2 के साथ प्रक्रियाओं की निगरानी करके यदि वे पूरा होने पर बाहर निकल रहे हैं) और देखें कि कौन छोड़ा गया है।

3

एक विकल्प - जो आपके मामले पर लागू हो सकता है (या नहीं कर सकता) gen_event व्यवहार का उपयोग करना है।

अस्वीकरण

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

अस्वीकरण

का अंत तो ...

OTP में, तो इवेंट मैनेजर एक नामित वस्तु जो करने के लिए घटनाओं भेजा जा सकता है है।

घटनाक्रम संदेश हैं।

ईवेंट मैनेजर में, शून्य, एक या कई ईवेंट हैंडलर स्थापित हैं। जब ईवेंट मैनेजर को किसी ईवेंट के बारे में अधिसूचित किया जाता है, तो ईवेंट को सभी इंस्टॉल किए गए ईवेंट हैंडलर द्वारा संसाधित किया जाएगा।

तो, मूल रूप से, एक पर्यवेक्षक और कई श्रमिकों के बजाय, आपके पास एक ईवेंट मैनेजर और कई ईवेंट हैंडलर हैं।

फिर आप gen_event:sync_notify/2 समारोह इस्तेमाल कर सकते हैं:

sync_notify भावना है कि यह के बाद ठीक वापस आ जाएगी घटना सभी ईवेंट हैंडलर्स ने संभाला कर दिया गया है में तुल्यकालिक है।

* gen_event के बारे में अधिक जानकारी के लिए * here और there देखो।

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