¿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
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.
Más información sobre los actors.
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.
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:
Traiga su café!
- 1. Métodos recursivos para crear secuencias en Scala
- 2. Sockets de pitón no bloqueantes
- 3. sobreescribir métodos en Scala
- 4. Enchufes no bloqueantes: ¿están en cola los mensajes?
- 5. Mejorar métodos predefinidos en Scala
- 6. métodos estáticos abstractas en Scala
- 7. Funciones vs métodos en Scala
- 8. métodos que terminan en Scala _ =
- 9. Sockets de cliente y servidor no bloqueantes en C
- 10. Cómo sobrecargue función Scala aplicar métodos
- 11. Cómo crear un DSL interno en Scala?
- 12. Cómo crear anotaciones y obtenerlas en scala
- 13. Cómo crear un mapa ordenado en scala?
- 14. concurrencia de Ruby: E/S no bloqueantes frente a subprocesos
- 15. comportamiento asintótico de métodos Scala
- 16. ¿Cómo declaras valores y métodos de objetos abstractos en scala?
- 17. Cómo obtener la lista de métodos en Scala
- 18. ¿Cómo puedo obtener objetos de función de métodos en Scala?
- 19. Métodos y métodos del método Scala como parámetros
- 20. Método en objeto complementario compilado en métodos estáticos en scala?
- 21. Anulación de los rasgos y los métodos abstractos en Scala
- 22. scala - ¿Puedo sobrecargar los métodos de curry?
- 23. Crear AlertDialog con métodos estáticos?
- 24. ¿Cómo crear dinámicamente métodos de instancia en tiempo de ejecución?
- 25. Crear cierre desde genérico en Scala
- 26. ¿De qué sirven los métodos asociativos de derechos en Scala?
- 27. ¿Cómo crear y usar una matriz multidimensional en Scala?
- 28. ¿Cómo crear instancias y poblar un Scala Stream en Java?
- 29. ¿Cómo puedo crear la función anónima curry en scala?
- 30. Cómo crear métodos de argumentos variables en Objective-C