2010-05-31 9 views
6

संदेश को एरलैंग कार्य में कैसे लूप करता है, क्या वे संदेश संसाधित करते समय सिंक होते हैं?एरलांग संदेश लूप

जहां तक ​​मैं समझता हूं, लूप एक संदेश में "प्राप्त" से शुरू होगा और फिर कुछ निष्पादित करेगा और लूप का एक और पुनरावृत्ति मारा जाएगा।

तो क्या सिंक होना है? सही?

यदि एकाधिक ग्राहक एक ही संदेश लूप पर संदेश भेजते हैं, तो उन सभी संदेशों को कतारबद्ध किया जाता है और एक के बाद एक किया जाता है, या?

समानांतर में एकाधिक संदेशों को संसाधित करने के लिए, आपको विभिन्न प्रक्रियाओं में एकाधिक संदेश लूप बनाना होगा, है ना?

या क्या मैंने इसे सब गलत समझा?

उत्तर

9

संदेश भेजना असीमित है। एक संदेश को संसाधित करना तुल्यकालिक है - एक समय में एक संदेश प्राप्त होता है - क्योंकि प्रत्येक प्रक्रिया का अपना (और केवल एक) मेलबॉक्स होता है।

4

पुस्तिका (Erlang concurrency

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

तो आप रेगेक्स के साथ प्राइयो बना सकते हैं, लेकिन समेकन एकाधिक प्रक्रियाओं के माध्यम से किया जाता है।