Crear trabajadores y pedirles futuros utilizando !!
; luego lea los resultados (que se calcularán y aparecerán en paralelo cuando estén listos; luego puede usarlos). Por ejemplo:
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)
}
}
Esto hace un cálculo muy barato - el cálculo de la longitud de una cadena - pero se puede poner algo caro allí para asegurarse de que realmente sucede en paralelo (la última cosa que el caso de la el bloque del acto debe ser responder con la respuesta). Tenga en cuenta que también incluimos un caso para que el trabajador se cierre solo, y cuando terminemos, les decimos a los trabajadores que se apaguen. (En este caso, cualquier no-cadena apaga el trabajador.)
y podemos probar esto para asegurarse de que funciona:
scala> Example.main(Array("This","is","a","test"))
List(4, 2, 1, 4)
Esto es demasiado simple, debe haber algo mal con él ;-) Se ve muy bien, gracias de nuevo. – 7zark7
@ 7zark7 Sí, me sentí de esa manera también. :-) Se compila, sin embargo, y no creo que haya cometido ningún error en particular. Asegúrese de que 'process' no arroje excepciones, y tenga en cuenta que si va a hacer I/O, puede que no funcione tan bien como esperaba, ya que los futuros en ejecución simplemente bloquearán los hilos en espera. –
Funciona. De hecho, lo probé para asegurarme de que realizaba tantas tareas al mismo nivel que el estilo de actor (tenía curiosidad, ya que no lo había hecho antes o había investigado el código fuente 'Futures'), y lo hace. –