का उपयोग कर साझा निर्भरता के साथ लूप के लिए कैसे लिखूं? हमारे पास कुछ कोड है जो तेजी से चलने की आवश्यकता है। यह पहले से ही प्रोफाइल है इसलिए हम कई धागे का उपयोग करना चाहते हैं। आम तौर पर मैं मेमोरी कतार में एक सेट अप करता हूं, और कतार की नौकरियां लेने और परिणामों की गणना करने वाले कई धागे हैं। साझा डेटा के लिए मैं एक ConcurrentHashMap या इसी तरह का उपयोग करता हूं।मैं अभिनेताओं
मैं वास्तव में उस मार्ग को फिर से नीचे नहीं जाना चाहता हूं। अभिनेताओं का उपयोग करके मैंने जो पढ़ा है, उसके परिणामस्वरूप क्लीनर कोड होगा और यदि मैं 1 से अधिक जेवीएम में माइक्रेट करने वाला एक्क्का का उपयोग करना आसान होना चाहिए। क्या यह सच है?
हालांकि, मुझे नहीं पता कि अभिनेताओं में कैसे सोचना है, इसलिए मुझे यकीन नहीं है कि कहां से शुरू करना है।
case class Trade(price:Double, volume:Int, stock:String) {
def value(priceCalculator:PriceCalculator) =
(priceCalculator.priceFor(stock)-> price)*volume
}
class PriceCalculator {
def priceFor(stock:String) = {
Thread.sleep(20)//a slow operation which can be cached
50.0
}
}
object ValueTrades {
def valueAll(trades:List[Trade],
priceCalculator:PriceCalculator):List[(Trade,Double)] = {
trades.map { trade => (trade,trade.value(priceCalculator)) }
}
def main(args:Array[String]) {
val trades = List(
Trade(30.5, 10, "Foo"),
Trade(30.5, 20, "Foo")
//usually much longer
)
val priceCalculator = new PriceCalculator
val values = valueAll(trades, priceCalculator)
}
}
मैं अगर यह सराहनीय होगा अभिनेताओं उपयोग करने का सुझाव सकता है कि यह कैसे अभिनेताओं को नक्शे पर होगा अनुभव के साथ किसी को:
समस्या यहाँ का एक बेहतर विचार कुछ नमूना कोड दे रहा है।
धन्यवाद, यह बहुत उपयोगी है और नौकरियों बिट के वितरण बताते हैं। निर्भरता मुद्दे के बारे में क्या। उदाहरण के लिए, यदि व्यस्त कार्य कम्प्यूटेशनल रूप से महंगी गणना पर निर्भर करता है जहां परिणाम अन्य कार्यों द्वारा साझा किए जा सकते हैं। यह एक नए अभिनेता वर्ग द्वारा किया जा सकता है लेकिन फिर श्रमिक अभिनेता अवरुद्ध हो जाएंगे। –
यदि आप साझा परिणाम चाहते हैं, तो आपको अभी भी 'ConcurrentHashMap' और उसके दोस्तों का उपयोग करना चाहिए। अभिनेताओं का उद्देश्य डेटा साझा किए बिना उपयोग किया जाना है (अपरिवर्तनीय संदेशों को छोड़कर)। आप उन्हें अन्य तरीकों से भी उपयोग कर सकते हैं, लेकिन यदि आप करते हैं, तो आप अन्य दृष्टिकोणों के सभी नुकसान को अपनाते हैं। –
@ थॉमस मुझे कोई कारण नहीं दिखता कि यह साझा परिणाम अभिनेताओं के साथ क्यों नहीं किया जा सकता है। आप एक अभिनेता के संदर्भ को पास करते हैं जो परिणाम प्राप्त करने के लिए परिणाम (और इसे बाद में कैश) की गणना करने के बारे में जानता है, और परिणाम प्राप्त करने के लिए मजदूर सिर्फ '!?' का उपयोग करते हैं। जब तक कि अभिनेता खत्म नहीं हो जाता तब तक वे ब्लॉक करेंगे। इसके बाद यह बदले में प्रत्येक कॉलर को परिणाम देगा। –