scala - significa - seo imagenes wordpress
¿En qué se diferencia la implementación de actores múltiples en Scala? (3)
Esta respuesta no es realmente mía. Fue producido por Viktor Klang (de la fama de Akka) con la ayuda de David Pollak (de Lift fame), Jason Zaugg (de la fama de Scalaz), Philipp Haller (de la fama de Scala Actors).
Todo lo que estoy haciendo aquí es formatearlo (lo cual sería más fácil si Stack Overflow soporta tablas).
Hay algunos lugares que llenaré más tarde cuando tenga más tiempo.
Filosofía de diseño
Actores de Scalaz
Complejidad mínima. Máxima generalidad, modularidad y extensibilidad.
Actores de levantamiento
Mínima complejidad, recolección de basura por JVM en lugar de preocuparse por un ciclo de vida explícito, comportamiento de manejo de errores consistente con otros programas de Scala y Java, espacio de memoria liviano / pequeño, buzón de correo, estáticamente similar a Scala Actors y actores de Erlang, alto rendimiento.
Actores de Scala
Proporcione el modelo completo de Erlang actor en Scala, peso ligero / memoria pequeña.
Actores Akka
Simple y transparentemente distribuible, de alto rendimiento, ligero y altamente adaptable.
Versiones
Scalaz Actors Lift Actors Scala Actors Akka Actors Current stable ver. 5 2.1 2.9.0 0.10 Minimum Scala ver. 2.8 2.7.7 2.8 Minimum Java ver. 1.5 1.5 1.6
Soporte de modelo de actor
Scalaz Actors Lift Actors Scala Actors Akka Actors Spawn new actors Yes Yes Yes Yes inside of actor Send messages to Yes Yes Yes Yes known actor Change behavior Actors are Yes Yes: nested Yes: for next message immutable react/receive become/unbecome Supervision Not provided No Actor: Yes, Yes (link/trapExit) Reactor: No
Nivel de aislamiento del estado
Si el usuario define los métodos públicos en sus Actores, ¿pueden invocarse desde el exterior?
- Actores Scalaz: n / a. El actor es un rasgo sellado.
- Actores de levantamiento: sí
- Actores de Scala: Sí
- Actores Akka: No, la instancia del actor está protegida detrás de un ActorRef.
Tipo de actor
- Actores Scalaz:
Actor[A] extends A => ()
-
LiftActor
:LiftActor
,SpecializeLiftActor[T]
- Scala Actors:
Reactor[T]
,Actor extends Reactor[Any]
- Akka Actores:
Actor[Any]
Actor gestión del ciclo de vida
Scalaz Actors Lift Actors Scala Actors Akka Actors Manual start No No Yes Yes Manual stop No No No Yes Restart-on-failure n/a Yes Yes Configurable per actor instance Restart semantics n/a Rerun actor Restore actor to stable state by re-allocating it and behavior throw away the old instance Restart configurability n/a n/a X times, X times within Y time Lifecycle hooks provided No lifecycle act preStart, postStop, preRestart, postRestart
Modos de envío de mensajes
Scalaz Actors Lift Actors Scala Actors Akka Actors Fire-forget a ! message actor ! msg actor ! msg actorRef ! msg a(message) Send-receive-reply (see 1) actor !? msg actor !? msg actorRef !! msg actor !! msg Send-receive-future (see 2) actor !! msg actorRef !!! msg Send-result-of- promise(message). future.onComplete( f => to ! f.result ) future to(actor) Compose actor with actor comap f No No No function (see 3)
(1) Cualquier función f se convierte en tal actor:
val a: Msg => Promise[Rep] = f.promise
val reply: Rep = a(msg).get
(2) Cualquier función f se convierte en tal actor:
val a = f.promise
val replyFuture = a(message)
(3) Functor contravariante: actor comap f
. También la composición de Kleisli en Promise
.
Modos de respuesta de mensaje
TBD
Scalaz Actors Lift Actors Scala Actors Akka Actors reply-to-sender-in-message reply-to-message
Procesamiento de mensajes
Admite recepciones anidadas?
- Actores Scalaz: -
- Agentes de levantamiento: Sí (con un poco de codificación manual).
- Actores Scala: Sí, tanto la recepción basada en el hilo como la reacción basada en el evento.
- Actores Akka: No, la recepción de anidamiento puede provocar fugas de memoria y un rendimiento degradado a lo largo del tiempo.
Mecanismo de ejecución de mensajes
TBD
Scalaz Actors Lift Actors Scala Actors Akka Actors Name for Execution Mechanism Execution Mechanism is configurable Execution Mechanism can be specified on a per-actor basis Lifecycle of Execution Mechanism must be explicitly managed Thread-per-actor execution mechanism Event-driven execution mechanism Mailbox type Supports transient mailboxes Supports persistent mailboxes
Distribución / Actores remotos
Scalaz Actors Lift Actors Scala Actors Akka Actors Transparent remote n/a No Yes Yes actors Transport protocol n/a n/a Java Akka Remote Protocol serialization (Protobuf on top of TCP) on top of TCP Dynamic clustering n/a n/a n/a In commercial offering
Howtos
TBD
Scalaz Actors Lift Actors Scala Actors Akka Actors Define an actor Create an actor instance Start an actor instance Stop an actor instance
Con el lanzamiento de Scala 2.9.0, también se anunció el Stack Typesafe, que combina el lenguaje Scala con el framework Akka. Ahora, aunque Scala tiene actores en su biblioteca estándar, Akka usa su propia implementación. Y, si buscamos otras implementaciones, también descubriremos que Lift y Scalaz también tienen implementaciones.
Entonces, ¿cuál es la diferencia entre estas implementaciones?
Actores: Scala 2.10 vs Akka 2.3 vs Lift 2.6 contra Scalaz 7.1
Código de prueba y results para la latencia promedio y el rendimiento en JVM 1.8.0_x.
scala.actors fue el primer intento serio de implementar la concurrencia al estilo de Erlang en Scala que ha inspirado a otros diseñadores de bibliotecas a realizar implementaciones mejores (en algunos casos) y más efectivas. El mayor problema (al menos para mí) es que, a diferencia de los procesos de Erlang, complementados con OTP (que permite construir sistemas tolerantes a fallas), los scala.actors solo ofrecen una buena base, un conjunto de primitivas estables que se deben usar para construir un marco de más alto nivel: al final del día, tendrá que escribir sus propios supervisores, catálogos de actores, máquinas de estados finitos, etc., encima de los actores.
Y aquí Akka viene al rescate, ofreciendo una pila con todas las funciones para el desarrollo basado en actores: actores más idiomáticos, conjunto de abstracciones de alto nivel para la coordinación (equilibradores de carga, grupos de actores, etc.) y la construcción de sistemas tolerantes a fallas (supervisores , portado desde OTP , etc.), planificadores fácilmente configurables (despachadores), etc. Lo siento, si sueno grosero, pero creo que no habrá fusión en 2.9.0+ . Prefiero esperar que los actores de Akka reemplacen gradualmente la implementación de stdlib.
Scalaz . Normalmente tengo esta biblioteca en la lista de dependencias de todos mis proyectos, y cuando, por alguna razón, no puedo usar Akka , Scalaz Promises sin bloqueo (con toda la bondad, como
sequence
) combinado con los actores estándar están guardando El dia. Sin embargo, nunca usé actores de Scalaz como reemplazo de scala.actors o Akka .