Arbeiter erstellen und sie bitten, für Futures !!
verwendet wird; dann lese die Ergebnisse ab (die berechnet werden und parallel eingehen, sobald sie fertig sind; du kannst sie dann verwenden). Zum Beispiel:
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)
}
}
Dies hat eine sehr kostengünstige Berechnung - die Länge eines Strings Berechnung - aber man kann etwas teuer dort setzen, um sicherzustellen, dass es wirklich parallel geschieht (das Letzte, was Falle der Akt Block sollte sein, mit der Antwort zu antworten). Beachten Sie, dass wir auch einen Fall für den Arbeiter einschließen, um sich selbst zu schließen, und wenn wir fertig sind, sagen wir den Arbeitern, dass sie herunterfahren sollen. (In diesem Fall wird jeder nicht-String schließt die Arbeiter nach unten.)
Und wir können dies sicher zu machen versuchen, es funktioniert:
scala> Example.main(Array("This","is","a","test"))
List(4, 2, 1, 4)
Das ist zu einfach, da muss etwas nicht stimmen ;-) Sieht gut aus, nochmals vielen Dank. – 7zark7
@ 7zark7 Ja, ich habe mich auch so gefühlt. :-) Es kompiliert aber, und ich glaube nicht, dass ich einen bestimmten Fehler gemacht habe. Stellen Sie sicher, dass "process" keine Exceptions auslöst, und beachten Sie, dass es bei I/O möglicherweise nicht so gut funktioniert, wie Sie es erwarten, da die laufenden Futures nur die wartenden Threads blockieren. –
Es funktioniert. Tatsächlich habe ich es getestet, um sicherzustellen, dass es ebenso effizient funktioniert wie der Schauspieler-Stil (ich war neugierig, da ich das vorher nicht getan hatte oder in den 'Futures'-Quellcode geschaut habe), und das tut es auch. –