मुझे पहले कहना है कि मेरे पास बहुत सारे जावा अनुभव हैं, लेकिन हाल ही में कार्यात्मक भाषाओं में दिलचस्पी है। हाल ही में मैंने स्कैला को देखना शुरू कर दिया है, जो एक बहुत अच्छी भाषा की तरह लगता है।स्कैला अभिनेता: बनाम प्रतिक्रिया
हालांकि, मैं Programming in Scala में स्कैला के अभिनेता ढांचे के बारे में पढ़ रहा हूं, और एक बात है जिसे मैं समझ नहीं पा रहा हूं। अध्याय 30.4 में यह कहता है कि के बजाय का उपयोग करके थ्रेड का पुन: उपयोग करना संभव हो जाता है, जो प्रदर्शन के लिए अच्छा है, चूंकि धागे JVM में महंगी हैं।
क्या इसका मतलब यह है कि, जब तक मुझे receive
के बजाय react
पर कॉल करना याद है, तो मैं जितना चाहूं उतने अभिनेताओं को शुरू कर सकता हूं? स्कैला की खोज करने से पहले, मैं एरलांग के साथ खेल रहा हूं, और Programming Erlang के लेखक ने पसीना तोड़ने के बिना 200,000 से अधिक प्रक्रियाओं के बारे में दावा किया है। मैं जावा धागे के साथ ऐसा करने से नफरत करता हूं। एरलांग (और जावा) की तुलना में स्कैला में मैं किस तरह की सीमाएं देख रहा हूं?
इसके अलावा, यह धागा स्कैला में फिर से उपयोग कैसे करता है? चलो, सादगी के लिए, कि मेरे पास केवल एक धागा है। क्या मैं सभी अभिनेताओं को इस धागे में क्रमशः दौड़ना शुरू करूंगा, या कुछ प्रकार के कार्य-स्विचिंग होंगे? उदाहरण के लिए, यदि मैं एक दूसरे के लिए पिंग-पोंग संदेश दो अभिनेताओं को शुरू करता हूं, तो क्या वे उसी धागे में शुरू होने पर डेडलॉक को जोखिम देंगे?
स्काला में प्रोग्रामिंग, अभिनेता लेखन react
उपयोग करने के लिए के अनुसार receive
साथ की तुलना में अधिक मुश्किल है। यह सराहनीय लगता है, क्योंकि react
वापस नहीं आता है। हालांकि, यह पुस्तक दिखाती है कि Actor.loop
का उपयोग करके आप लूप के अंदर react
कैसे डाल सकते हैं। नतीजतन, आप
loop {
react {
...
}
}
मेरे लिए बहुत
while (true) {
receive {
...
}
}
जो पुस्तक में पहले ही प्रयोग किया जाता है के समान लगता है जो मिलता है। फिर भी, पुस्तक कहती है कि "व्यावहारिक रूप से, कार्यक्रमों को कम से कम receive
" की आवश्यकता होगी। तो मैं यहाँ क्या याद कर रहा हूँ? receive
क्या कर सकते हैं react
वापसी के अलावा नहीं कर सकते हैं? और मुझे परवाह क्यों है?
अंत में, जो मुझे समझ में नहीं आता है, उसके मूल में आ रहा है: पुस्तक react
का उपयोग करने का उल्लेख करती है कि थ्रेड का पुनः उपयोग करने के लिए कॉल स्टैक को त्यागना संभव हो जाता है। वह कैसे काम करता है? कॉल स्टैक को त्यागना क्यों जरूरी है? और एक कार्य को अपवाद (react
) फेंकने से समाप्त होने पर कॉल स्टैक क्यों छोड़ा जा सकता है, लेकिन जब यह लौटने से समाप्त नहीं होता है (receive
)?
मुझे लगता है कि स्कैला में प्रोग्रामिंग कुछ प्रमुख मुद्दों पर चमक रहा है, जो शर्म की बात है, क्योंकि अन्यथा यह वास्तव में एक उत्कृष्ट पुस्तक है।
यह भी देखें http://stackoverflow.com/questions/1526845/when-are-threads-created-for-scala-actors –