2010-08-27 12 views
77

क्या अभिनेता धागे की तुलना में काम करता है कि कोई अच्छी और संक्षिप्त व्याख्या है?अभिनेता धागे की तुलना में कैसे काम करते हैं?

क्या कोई धागा अभिनेता के रूप में नहीं देखा जा सकता है और अन्य धागे को संदेश भेज सकता है? मुझे कुछ अंतर दिखाई देता है, लेकिन यह मेरे लिए स्पष्ट नहीं है। क्या मैं थ्रेड का अलग-अलग उपयोग करके किसी भी भाषा में अभिनेता का उपयोग कर सकता हूं?

उत्तर

62

अभिनेता मॉडल संदेश पास करने पर काम करता है। व्यक्तिगत प्रक्रियाओं (कलाकारों) को संदेशों को एक-दूसरे के लिए असीमित रूप से भेजने की अनुमति है। जो हम आम तौर पर थ्रेडिंग मॉडल के रूप में सोचते हैं उससे यह अलग करता है, यह है कि (कम से कम सिद्धांत में) कोई साझा स्थिति नहीं है। और अगर कोई मानता है (न्यायसंगत रूप से, मुझे लगता है) कि साझा राज्य सभी बुराइयों की जड़ है, तो अभिनेता मॉडल बहुत आकर्षक हो जाता है।

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

क्या कोई धागा अभिनेता के रूप में नहीं देखा जा सकता है और अन्य धागे को संदेश भेज सकता है?

अच्छा, हाँ और नहीं। नहीं, अगर आप साझा स्मृति स्थानों के आस-पास म्यूटेक्स डालने के दृष्टिकोण का उपयोग कर रहे हैं। फिर धागे इस राज्य को साझा करते हैं - दोनों के पास इस स्मृति तक पहुंच है, दोनों इसे पढ़ सकते हैं, इसे फिर से लिख सकते हैं, आदि। लेकिन आप एक थ्रेडिंग मॉडल के शीर्ष पर एक अभिनेता मॉडल बना सकते हैं, और वास्तव में सभी अभिनेता कार्यान्वयन में धागे होते हैं नीचे। मैंने प्रत्येक थ्रेड को एक म्यूटेक्स द्वारा संरक्षित कतार प्रदान करके इस तरह कुछ (बहुत बुरी तरह) हैक किया है - बस मस्ती के लिए। अभिनेता-थ्रेड प्रतिबाधा को प्रबंधित करने के बारे में एक विचार प्राप्त करने के लिए, my question from a year ago देखें।

क्या मैं थ्रेड का अलग-अलग उपयोग करके किसी भी भाषा में अभिनेता मॉडल का उपयोग कर सकता हूं?

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

आप सॉफ़्टवेयर ट्रांजेक्शन मेमोरी को भी देखना चाहते हैं, जो एक अलग लेकिन आकर्षक मॉडल भी है। क्लोजर इसका मेरा पसंदीदा उदाहरण है।

+2

अधिक मैं अतुल्यकालिक संदेश का उपयोग आधारित संगामिति मॉडल गुजर (जैसे अभिनेताओं या async/इंतजार है), और अधिक मुझे लगता है कि वे पुराने, मानक सिंक्रनाइज़ अवरुद्ध संगामिति मॉडल की सिर्फ दोहरी कर रहे हैं। असीमित संदेश गुजरना वास्तव में ताले और मॉनीटर का उपयोग करने से कहीं अधिक आसान या कठिन नहीं है।वास्तव में, कोई साझा म्यूटेबल राज्य नहीं है, लेकिन केवल * एकल अभिनेता स्तर * पर। लेकिन एक अभिनेता के पास अभी भी परिवर्तनीय स्थिति है, और यह वास्तव में उन सभी कलाकारों द्वारा देखा जा सकता है जो इसके साथ सहयोग करते हैं। इसलिए आप सभी समान समस्याएं प्राप्त कर सकते हैं: डेडलॉक्स, आजीविका, भुखमरी, दौड़ की स्थिति इत्यादि। –

2

मैं यह नहीं कहूंगा कि अभिनेता हमेशा संदेशों को असीमित रूप से पास करते हैं - यह बहुत धीमा होगा। मामले में मामला, जेएक्टर प्रोजेक्ट एक विधि कॉल बेहतर मॉडल के लिए 2-तरफा संदेश (अनुरोध/प्रतिक्रिया) का उपयोग करता है। और अधिकांश अनुरोधों को समकालिक रूप से सर्विस किया जाता है।

जेएक्टर (जावा लाइब्रेरी) ताले का उपयोग नहीं करता है। केवल कुछ परमाणु और समवर्ती डेटा संरचनाएं, जिनमें कुछ सेफफोर्स फेंक दिए गए हैं। संदेश पासिंग प्रति सेकंड 8 बिलियन संदेश है।

https://github.com/laforge49/JActor

+1

अभिनेता मॉडल को केवल एसिंक्रोनस संचार (http://en.wikipedia.org/wiki/Actor_model) का उपयोग करके परिभाषित किया जाता है। यदि जेएक्टर ऐसा नहीं कर रहा है, तो यह केवल 100% अभिनेता मॉडल नहीं है। यह केवल अभिनेता मॉडल का उपयोग अपनी कई सुविधाओं में से एक के रूप में कर सकता है। –

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