El modelo de actor opera con el paso de mensajes. Los procesos individuales (actores) pueden enviarse mensajes de forma asincrónica entre sí. Lo que lo distingue de lo que normalmente consideramos el modelo de enhebrado es que no existe (al menos en teoría) un estado compartido. Y si uno cree (con razón, creo) que el estado compartido es la raíz de todo mal, entonces el modelo de actor se vuelve muy atractivo.
Sin embargo, no deberíamos emocionarnos demasiado. El modelo de actor no hace (contrariamente a algunas acusaciones) que sea imposible tener puntos muertos. El modelo de actor tampoco le impide tener contienda por recursos entre diferentes procesos, por ejemplo, colas de mensajes. El modelo solo está "libre de bloqueo" por encima de un cierto nivel. En un nivel inferior, para coordinar las colas de mensajes, sigue siendo necesario bloquear.
¿No se puede ver un hilo como actor y enviar mensajes a otros hilos?
Bueno, sí y no. No, si solo está utilizando el enfoque de colocar mutex alrededor de las ubicaciones de memoria compartida. Luego, los subprocesos comparten este estado: ambos tienen acceso a esta memoria, pueden leerlo, reescribirlo, etc. Pero puede construir un modelo de actor sobre un modelo de subprocesos y, de hecho, todas las implementaciones de actor tienen subprocesos debajo. He pirateado algo como esto (muy mal) al darle a cada hilo una cola protegida por un mutex, solo por diversión. Para tener una idea de cómo se gestiona la impedancia del hilo del actor, consulte mi pregunta de hace un año .
¿Puedo usar el modelo de actor en cualquier idioma usando hilos de manera diferente?
Sí, pero tomará un poco más de trabajo. Es posible que su idioma favorito tenga una biblioteca de transmisión de mensajes, por lo que sería lo primero que debe investigar. Además, debe investigar el uso de estructuras de datos inmutables. Tenga en cuenta que si una estructura de datos es inmutable, entonces esencialmente se ha ocupado del problema del "estado compartido": varios subprocesos pueden contener referencias a datos inmutables sin que ocurra nada malo. Hay una razón por la que los lenguajes de actor tienden a ser también lenguajes funcionales (erlang, scala).
Es posible que también desee echar un vistazo a la memoria transaccional de software, que es un modelo diferente pero también atractivo. Clojure es mi ejemplo favorito de eso.
No diría que los actores siempre pasan mensajes de forma asincrónica, eso sería demasiado lento. Por ejemplo, el proyecto JActor utiliza mensajes bidireccionales (solicitud / respuesta) para modelar mejor una llamada a un método. Y la mayoría de las solicitudes se atienden de forma sincrónica.
JActor (una biblioteca de Java) tampoco usa bloqueos. Solo algunas estructuras de datos atómicas y concurrentes, con algunos semáforos lanzados. El paso de mensajes es de aproximadamente .8 mil millones de mensajes por segundo.
https://github.com/laforge49/JActor
fuente