Создайте рабочих и спросите их о будущем, используя !!
; затем прочитайте результаты (которые будут рассчитаны и введены параллельно, когда они будут готовы; затем вы можете использовать их). Например:
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)