2010-02-10 13 views
8

मैंने "संदेश पास करने" के लिए दो विधियों को देखा है। एक मैंने एरलांग उपयोग देखा है और दूसरा स्टैकलेस पायथन से है। से क्या मैं यहाँ समझ में अंतरअवरुद्ध चैनल बनाम एसिंक संदेश

Erlang शैली है - संदेश भेजा और प्राप्त करने की प्रक्रिया के मेलबॉक्स में पंक्तिबद्ध कर रहे हैं। वहां से उन्हें फीफो आधार पर हटा दिया जाता है। एक बार पहली प्रक्रिया संदेश भेजती है तो यह जारी रखने के लिए स्वतंत्र है।

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

अब मैं Erlang विधि जा रहा है कि आप किसी भी अवरुद्ध प्रक्रियाओं की जरूरत नहीं है के पेशेवरों को देखते हैं। यदि बी कभी प्राप्त नहीं कर पाता है, तो ए भी जारी रख सकता है। हालांकि मैंने कुछ कार्यक्रमों में मैंने देखा है, कि एरलांग संदेश बॉक्स के लिए सैकड़ों (या हजारों) संदेशों से भरा होना संभव है क्योंकि संदेशों का प्रवाह बहिर्वाह से अधिक है।

अब मैं एक बड़े कार्यक्रम या तो ढांचा/भाषा अपने अनुभवों को तो मैं सोच रहा हूँ इस के साथ कर रहे हैं में नहीं लिखा है, और अगर यह कुछ मैं भी के बारे में चिंता करनी चाहिए।

हाँ, मैं जानता हूँ कि यह सार है, लेकिन मैं यह भी नहीं बल्कि अमूर्त जवाब के लिए देख रहा हूँ।

उत्तर

6

Erlang प्रोग्रामिंग में मेरा अनुभव है कि जब आप एक उच्च मैसेजिंग दर की उम्मीद (जो है, उपभोक्ता की तुलना में एक तेजी से निर्माता) तो आप अपने खुद प्रवाह नियंत्रण जोड़ने है। एक साधारण परिदृश्य

  • उपभोक्ता: संदेश भेजें, एके की प्रतीक्षा करें, फिर दोहराएं।
  • निर्माता: संदेश के लिए प्रतीक्षा करें, संदेश प्राप्त होने और संसाधित होने पर एके भेजें, फिर दोहराएं।

कोई भी इसे उलटा कर सकता है, निर्माता उपभोक्ता के आने और एन अगले उपलब्ध संदेशों को पकड़ने की प्रतीक्षा करता है।

इन दृष्टिकोणों और अन्य प्रवाह नियंत्रण कार्यों के पीछे छिपाया जा सकता है, पहला gen_server:call/2,3 में पहले से ही gen_server ओटीपी व्यवहार प्रक्रिया के विरुद्ध उपलब्ध है।

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

3

मोटे तौर पर इस असीम कतारों बनाम घिरा कतार है। एक स्टैकलेस चैनल को 0 आकार के साथ कतार का एक विशेष मामला माना जा सकता है।

बाउंड कतारों में डेडलॉक की प्रवृत्ति है। दो धागे/प्रक्रियाएं एक दूसरे को एक संदेश भेजने की कोशिश कर रही हैं, दोनों एक पूर्ण कतार के साथ।

असंबद्ध कतारों में अधिक सूक्ष्म विफलता है। जैसा कि आपने उल्लेख किया है, एक बड़ा मेलबॉक्स विलंबता आवश्यकताओं को पूरा नहीं करेगा। काफी दूर जाओ और अंत में यह बह जाएगा; अनंत स्मृति जैसी कोई चीज नहीं है, इसलिए यह वास्तव में केवल एक सीमा वाली कतार है जो पूर्ण सीमा के साथ प्रक्रिया को समाप्त करता है।

कौन सा सबसे अच्छा है? यह कहना मुश्किल है। यहां कोई आसान जवाब नहीं है।