अक्का किल बनाम स्टॉप बनाम जहर की गोली?


212

अक्का का नौसिखिया सवाल - मैं अक्का अनिवार्यता पर पढ़ रहा हूं, क्या कोई अक्का स्टॉप / पॉइजन पिल बनाम किल के बीच अंतर बता सकता है? पुस्तक केवल एक छोटा सा विवरण प्रस्तुत करती है "किल सिंक्रोनस है। जहर की गोली अतुल्यकालिक है।" लेकिन किस तरीके से? क्या इस दौरान कॉलिंग एक्टर थ्रेड लॉक करता है? क्या बच्चों के अभिनेताओं को मारने, पोस्ट-स्टॉप एनवॉक, आदि के दौरान अधिसूचित किया जाता है? उदाहरण एक अवधारणा का उपयोग करता है बनाम दूसरे का?

बहुत धन्यवाद!


12
rs_atl ने इसे बहुत अच्छी तरह से उत्तर दिया, मुझे सिर्फ यह जोड़ना है कि अभिनेताओं के बारे में कुछ भी समकालिक नहीं है, यहां तक ​​कि संदर्भ भी नहीं है। स्टॉप (स्व)।
रोलैंड कुह्न

1
@RolandKuhn किस बारे में context.become?
इओनु

3
context.becomeव्यवहार को अगले संदेश पर लागू करने के लिए नामित करता है, जिसका अर्थ है कि यह वर्तमान संदेश के संसाधित होने के बाद प्रभावी होता है; इस संबंध में यह काफी पसंद है context.stop(self)
रोलैंड कुह्न

जवाबों:


328

दोनों stopऔर PoisonPillअभिनेता समाप्त कर देंगे और संदेश कतार बंद हो जाएगा। वे अभिनेता को संदेश संसाधित करने से रोकेंगे, अपने सभी बच्चों को स्टॉप कॉल भेजेंगे, उनके समाप्त होने की प्रतीक्षा करेंगे, फिर उसके postStopहुक को कॉल करेंगे । आगे के सभी संदेश मृत पत्र मेलबॉक्स में भेजे गए हैं।

अंतर यह है कि इस क्रम के शुरू होने से पहले संदेशों को संसाधित किया जाता है। stopकॉल के मामले में , वर्तमान में संसाधित किया जा रहा संदेश पहले पूरा हो गया है, अन्य सभी को छोड़ दिया गया है। भेजते समय PoisonPill, यह कतार में एक और संदेश है, इसलिए अनुक्रम PoisonPillप्राप्त होने पर शुरू होगा । कतार में इसके आगे आने वाले सभी संदेशों को पहले संसाधित किया जाएगा।

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

डॉक्स में 'स्टॉपिंग एक्टर', 'किलिंग एक्टर' सेक्शन भी देखें:

http://doc.akka.io/docs/akka/snapshot/scala/actors.html

और पर्यवेक्षण रणनीतियों पर अधिक:

http://doc.akka.io/docs/akka/snapshot/scala/fault-tolerance.html


4
उत्कृष्ट जवाब धन्यवाद, अक्का ट्यूटोरियल पर पोस्ट किया जाना चाहिए!
लालोइनडब्लिन

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

वास्तव में यह काफी कष्टप्रद है क्योंकि अभिनेताओं को फिर से शुरू करने का एकमात्र अंतर्निहित तरीका एक अपवाद है।
Lisak

या एक पर्यवेक्षक अभिनेता से एक PoisonPill भेज रहा है जिसे फिर से शुरू किया जाना चाहिए और इसे फिर से शुरू करना चाहिए।
Lisak

उपयोग करने पर कोई अंतर है context.stop(self)?
बार

1

जब भी आप कर सकते हैं PoisonPill का उपयोग करें। इसे मेलबॉक्स पर डाला जाता है और किसी अन्य संदेश की तरह इसका सेवन किया जाता है। आप एक अभिनेता के भीतर से "reference.stop (स्वयं)" का भी उपयोग कर सकते हैं।


0

PoisonPill पूर्व में मेलबॉक्स में प्राप्त किए गए सभी संदेशों के साथ PoisonPill के पहले होने के बाद, PoisonPill को असंगत रूप से रोक देता है।


20
नहीं, किल में कोई विशेष प्राथमिकता नहीं है, जैसे PoisonPill
Roland Kuhn

0

आप अभिनेताओं के प्रसंस्करण को रोकने के लिए अभिनेता रोक और जहर की गोली दोनों का उपयोग कर सकते हैं, और अभिनेता को पूरी तरह से समाप्त करने के लिए मार सकते हैं। x.stop एक कॉल है जिसे आप akka मेक मे मेथड में लाते हैं, केवल postStop को कॉल करने के बाद अभिनेता को नए अभिनेता से बदल देगा। एक्स ! PoisonPill एक ऐसी विधि है जिसे आप अभिनेता के पास जाने के लिए संसाधित करते हैं जब अभिनेता चल रहा होता है (अनुशंसित)। पोस्टटॉप को कॉल करने के बाद अभिनेता राज्य को भी बदल देगा। x.kill अभिनेता को समाप्त कर देगा और अभिनेता को अभिनेता पथ में हटा देगा और पूरे अभिनेता को एक नए अभिनेता के साथ बदल देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.