2009-09-04 13 views
5

¿Qué es una buena manera de crear métodos no bloqueantes en Scala? Una forma en que puedo pensar es crear un hilo/actor y el método simplemente envía un mensaje al hilo y lo devuelve. ¿Hay una mejor manera de crear un método sin bloqueo?¿Cómo crear métodos no bloqueantes en Scala?

Respuesta

13

Uso scala.actors.Future:

import actors._ 

def asyncify[A, B](f: A => B): A => Future[B] = (a => Futures.future(f(a))) 

// normally blocks when called 
def sleepFor(seconds: Int) = { 
    Thread.sleep(seconds * 1000) 
    seconds 
} 

val asyncSleepFor = asyncify(sleepFor) 
val future = asyncSleepFor(5) // now it does NOT block 
println("waiting...")   // prints "waiting..." rightaway 
println("future returns %d".format(future())) // prints "future returns 5" after 5 seconds 

sobrecargado "asyncify" que tiene una función con más de un parámetro se deja como ejercicio.

Una advertencia, sin embargo, es el manejo de excepciones. La función que está siendo "asincrificada" tiene que manejar todas las excepciones en sí atrapándolas. El comportamiento de las excepciones descartadas no está definido.

2

Depende de su definición de "bloqueo". Estrictamente hablando, cualquier cosa que requiera la adquisición de un bloqueo es bloqueante. Todas las operaciones que dependen del estado interno de un actor adquieren un bloqueo en el actor. Esto incluye envíos de mensajes. Si muchos hilos intentan enviar un mensaje a un actor todos a la vez, tienen que ponerse en línea.

Así que si realmente necesita sin bloqueo, hay varias opciones en java.util.concurrent.

Dicho esto, desde una perspectiva práctica, los actores le brindan algo lo suficientemente cercano al no bloqueo porque ninguna de las operaciones sincronizadas realiza una cantidad significativa de trabajo, por lo que es probable que los actores satisfagan sus necesidades.

1

que tienen una explicación muy completa en mi blog acerca de futuros. En realidad, le muestra cómo podría implementar futuros usted mismo, y por lo tanto le da una muy buena comprensión sobre el tema. Le sugiero que lo leas:

http://vigtig.it/blog/?p=73

Traiga su café!

Cuestiones relacionadas