धागे की तुलना में अभिनेता कैसे काम करता है?


88

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

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

जवाबों:


78

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

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

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

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

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

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

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


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

2

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

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

https://github.com/laforge49/JActor


2
अभिनेता मॉडल केवल एसिंक्रोनस संचार ( en.wikipedia.org/wiki/Actor_model ) का उपयोग करके परिभाषित किया गया है । अगर JActor ऐसा नहीं कर रहा है, तो यह 100% केवल अभिनेता मॉडल नहीं है। यह बस अभिनेता मॉडल को इसकी कई विशेषताओं में से एक के रूप में उपयोग कर सकता है।
बीटी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.