java continuations

Continuaciones en java



continuations (11)

¡Jugar! La versión 1.2.x de framework también tiene soporte para continuaciones integradas con productos async http goodies.

Tenga en cuenta que las continuaciones de Play 1.2.x solo funcionan con el servidor Netty incorporado .

Y Play 2.x todavía no tiene soporte para las continuaciones .

¿Hay una buena implementación de continuaciones en Java?

Si es así, ¿cómo es la sobrecarga? La JVM no fue diseñada con este tipo de cosas en mente, ¿verdad? Entonces, ¿esto es ir contra el grano?



Consulte Apache Javaflow http://commons.apache.org/sandbox/javaflow/

Es el único paquete de continuación para Java que está activamente en desarrollo. El otro, RIFE, no estoy seguro de en qué estado se encuentra.


Javaflow http://commons.apache.org/sandbox/javaflow/ Play framework use Javaflow http://blog.heroku.com/archives/2011/8/29/play/

RIFE http://www.artima.com/lejava/articles/continuations.html Uso de WebWork.

JauVM http://jauvm.blogspot.com/2005/07/so-what-does-it-do.html JVM en JVM, implementa llamada / continuación de cola

Scala 2.8 http://www.scala-lang.org/node/2096

Cocoon http://cocoon.apache.org/2.1/userdocs/flow/continuations.html http://wiki.apache.org/cocoon/RhinoWithContinuations

Jetty http://docs.codehaus.org/display/JETTY/Continuations volver a intentar la solicitud.

coroutines http://code.google.com/p/coroutines

jconts https://github.com/idubrov/jconts

jyield http://code.google.com/p/jyield

Kilim http://www.malhar.net/sriram/kilim/thread_of_ones_own.pdf

ATCT http://portal.acm.org/ft_gateway.cfm?id=949362



Otro competidor fuerte ha aparecido recientemente.

Quasar aplicaciones de Quasar forked de la implementación de Java de Matthias Mann para proporcionar funciones de nivel superior, como hilos ligeros , actors tipo Erlang y channels y channels tipo Go-like.

Hay muchos puntos de referencia e introducciones detalladas en el Blog de Quasar .

También existe una integración lista para usar llamada Comsat apunta a ayudar a crear fácilmente servicios web de alto rendimiento basados ​​en maquinaria de continuación bajo el capó.

Quasar también proporciona una buena API de Kotlin que se presentó en el reciente webinar de JetBrains Quasar: Fibras, canales y actores eficientes y elegantes .

Todo lo mencionado es de código abierto y de uso gratuito.

Ver también http://blog.paralleluniverse.co/2015/08/07/scoped-continuations/

Actualizar

La experiencia de Quasar se usó más tarde como base para el Proyecto Loom, que aims a brindar soporte de continuación directamente a JVM en algún momento más allá de Java 11.

Está en desarrollo activo ahora y ya tiene un prototype alfa en funcionamiento.


Si entiendo esto correctamente, supongo que el problema obvio consiste en desenrollar la pila con instancias de cierre activas. Supongo que un lenguaje con alcance léxico podría, en teoría, descubrir que un marco secundario puede crear una instancia de cierre, identificar aquellos marcos intermedios a los que se hace referencia, y luego podría bloquear esos marcos en lugar de simplemente empujarlos en la pila.

En este sentido, un compilador podría agrupar todas las tramas o todas las tramas primarias de un cierre que haga referencia a un objeto no vinculado globalmente.

Resumen

No creo que la JVM restrinja los cierres más que una máquina real, es solo que luchan contra el paradigma general de la pila y, por lo tanto, generalmente son castigados.


Si no le importan las continuaciones implícitas, Kilim es una excelente opción. Funciona al procesar métodos anotados y generar las continuaciones en el código de bytes para usted. Obviamente, hace mucho más ya que es un marco, pero si desea el rendimiento (excelente) de las continuaciones seguras de subprocesos, vale la pena echarle un vistazo.


Jetty tiene apoyo de continuation . Hay más discusión y algunas muestras en DZone .

No puedo aconsejar sobre las eficiencias o de otro tipo, aparte de decir que el equipo de Mortbay siempre parece estar consciente de tales problemas. Probablemente habrá una discusión sobre las compensaciones de implementación en algún lugar del sitio de Jetty.



Desde Java 8, ahora hay una clase CompletableFuture<T> que admite continuaciones y enfoques de programación más funcionales / reactivos.

Considere el siguiente ejemplo, donde una Clase ofrece un método downloadAndResize :

public CompletableFuture<Image> downloadAndResize(String imageUrl, int width, int height) { return CompletableFuture .supplyAsync(() -> downloadImage(imageUrl)) .thenApplyAsync(x -> resizeImage(x, width, height)); } private Image downloadImage(String url){ // TODO Download the image from the given url... } private Image resizeImage(Image source, int width, int height){ // TODO Resize the image to w / h }

El uso del método anterior podría verse como:

CompletableFuture<Image> imagePromise = downloadAndResize("http://some/url", 300, 200); imagePromise.thenAccept(image -> { // Gets executed when the image task has successfully completed // do something with the image });