multithreading - programming - akka
¿Cuándo se debe usar el modelo Actor? (2)
¿Cuándo se debe usar el Modelo Actor ?
Ciertamente no garantiza un entorno libre de estancamiento.
El actor A puede esperar un mensaje de B mientras B espera a A.
Además, si un actor tiene que asegurarse de que su mensaje se procesó antes de pasar a su próxima tarea, tendrá que enviar un mensaje y esperar que aparezca el mensaje "su mensaje fue procesado" en el lugar del simple bloqueo.
¿Cuál es el poder de la modelo?
Dado que problema de simultaneidad, ¿qué buscarías para decidir si usar actores o no?
Primero, buscaría definir el problema ... ¿es la motivación principal una aceleración de un ciclo o recursión anidada? Si es así, un enfoque simple basado en tareas o un enfoque de bucle paralelo funcionará bien para usted (en lugar de los actores).
Sin embargo, si tiene un sistema más complejo que involucra dependencias y coordina el estado compartido, entonces un enfoque de actor puede ayudar. Específicamente mediante el uso de actores y la semántica de transmisión de mensajes, a menudo puede evitar el uso de bloqueos explícitos para proteger el estado compartido haciendo copias de ese estado (mensajes) y reaccionando ante ellos.
Puede hacerlo fácilmente con los clásicos problemas de sincronización, como los filósofos del comedor y el problema de los barberos dormidos. Pero también puede usar el "actor" para ayudar con patrones más modernos, es decir, su fachada podría ser un actor, su vista modelo y su controlador también podrían ser actores que se comunican entre sí.
Otra cosa que he observado es que la semántica de los actores se puede aprender por la mayoría de los desarrolladores y es más segura que sus contrapartes bloqueadas. Esto se debe a que aumentan el nivel de abstracción y le permiten centrarse en coordinar el acceso a esos datos en lugar de proteger todos los accesos a los datos con bloqueos. Como ejemplo, imagine que tiene una clase simple con un miembro de datos. Si elige colocar un candado en esa clase para proteger el acceso a ese miembro de datos, entonces cualquier método en esa clase deberá asegurarse de que están accediendo a ese miembro de datos bajo el candado. Esto se vuelve particularmente problemático cuando otros (o usted) modifican la clase en una fecha posterior, tienen que recordar usar ese bloqueo.
Por otro lado, si esa clase se convierte en un actor y el miembro de datos se convierte en un búfer o puerto con el que se comunica mediante mensajes, no tiene que recordar tomar el bloqueo porque la semántica está integrada en el búfer y sabrá muy explícitamente si vas a bloquear eso según el tipo de buffer.
-Almiar
El uso de Actor es "natural" en al menos dos casos:
- Cuando puede descomponer su problema en un conjunto de tareas independientes.
- Cuando puede descomponer su problema en un conjunto de tareas vinculadas por un worflow claro (es decir, programación de flujo de datos ).
Por ejemplo, si se procesan datos complejos utilizando una serie de filtros, es fácil utilizar una cartera de actores en la que cada actor recibe datos de un actor para establecer y establecer datos para un actor intermedio.
Por supuesto, este flujo de datos no debe ser lineal y si un paso es lento en su canalización, puede utilizar un conjunto de actores haciendo el mismo trabajo. Otra forma de resolver los problemas de equilibrio de carga sería usar un enfoque basado en la demanda y organizado con un tipo de sistema Kanban virtual.
Por supuesto, necesitará sincronización entre los actores en casi todos los casos interesantes, pero al contrario del enfoque clásico de múltiples hilos, esta sincronización es realmente "concreta". Puedes imaginarte muchachos en una fábrica, imagina posibles problemas (los trabajadores se quedan sin trabajo, las operaciones previas son demasiado rápidas y los productos intermedios necesitan un gran lugar de almacenamiento, etc.) Por analogía, puedes encontrar una solución más fácilmente.