कार्यकर्ताओं बनाएँ और उन्हें !!
का उपयोग कर भविष्य के लिए पूछना; फिर परिणामों को पढ़ें (जिसे गणना की जाएगी और वे तैयार होने के समानांतर में आते हैं; फिर आप उनका उपयोग कर सकते हैं)। उदाहरण के लिए:
object Example {
import scala.actors._
class Worker extends Actor {
def act() { Actor.loop { react {
case s: String => reply(s.length)
case _ => exit()
}}}
}
def main(args: Array[String]) {
val arguments = args.toList
val workers = arguments.map(_ => (new Worker).start)
val futures = for ((w,a) <- workers zip arguments) yield w !! a
val results = futures.map(f => f() match {
case i: Int => i
case _ => throw new Exception("Whoops--didn't expect to get that!")
})
println(results)
workers.foreach(_ ! None)
}
}
यह एक बहुत ही सस्ती गणना करता है - एक स्ट्रिंग की लंबाई की गणना - लेकिन आप कुछ देखते महंगा यकीन है कि यह वास्तव में समानांतर में होता है (आखिरी बात की है कि मामला बनाने के लिए रख सकते हैं अधिनियम के साथ जवाब ब्लॉक होना चाहिए)। ध्यान दें कि हम कार्यकर्ता को खुद को बंद करने के लिए एक मामला भी शामिल करते हैं, और जब हम सब कुछ पूरा हो जाते हैं, तो हम श्रमिकों को बंद करने के लिए कहते हैं। (इस मामले में, किसी भी गैर-स्ट्रिंग कार्यकर्ता बंद हो जाता है।)
और हम यकीन है कि यह काम करता है बनाने के लिए इस बाहर की कोशिश कर सकते हैं:
scala> Example.main(Array("This","is","a","test"))
List(4, 2, 1, 4)
स्रोत
2010-04-02 03:40:48
यह बहुत आसान है, इसमें कुछ गड़बड़ होना चाहिए ;-) बहुत अच्छा लगता है, धन्यवाद। – 7zark7
@ 7zark7 हाँ, मुझे वह रास्ता भी लगा। :-) यह संकलित करता है, हालांकि, और मुझे नहीं लगता कि मैंने कोई विशेष गलती की है। सुनिश्चित करें कि 'प्रक्रिया' अपवाद नहीं फेंकती है, और जागरूक रहें कि यदि आप I/O करने जा रहे हैं, तो यह आपके साथ काम करने के साथ ही काम नहीं करेगा, क्योंकि चल रहे वायदा केवल थ्रेड को प्रतीक्षा कर देगा। –
यह काम करता है। असल में, मैंने यह सुनिश्चित करने के लिए परीक्षण किया कि यह अभिनेता शैली के रूप में कुशलतापूर्वक मल्टीटास्क करता है (मैं उत्सुक था, क्योंकि मैंने पहले ऐसा नहीं किया था या 'फ्यूचर्स' स्रोत कोड में देखा था) और ऐसा करता है। –