¿Cómo funcionan los actores en comparación con los hilos?


88

¿Hay alguna explicación buena y breve de cómo funcionan los actores en comparación con los hilos?

¿No se puede ver un hilo como actor y enviar mensajes a otros hilos? Veo alguna diferencia, pero no me queda tan claro. ¿Puedo usar Actors en cualquier idioma usando hilos de manera diferente?

Respuestas:


78

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.


3
Cuanto más uso modelos de concurrencia basados ​​en el paso de mensajes asíncronos (por ejemplo, actores o asíncrono / espera), más creo que son simplemente duales del antiguo modelo de concurrencia de bloqueo sincronizado estándar. El paso de mensajes asincrónico no es realmente más fácil ni más difícil que usar bloqueos y monitores. De hecho, no hay un estado mutable compartido, sino solo a nivel de actor único . Pero un actor todavía tiene un estado mutable, y en realidad es observable por todos los actores que cooperan con él. Por lo tanto, puede tener los mismos problemas: puntos muertos, bloqueos en vivo, inanición, condiciones de carrera, etc.
Piotr Kołaczkowski

2

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


2
El modelo de actor se define utilizando únicamente comunicación asincrónica ( en.wikipedia.org/wiki/Actor_model ). Si JActor no está haciendo eso, entonces no es 100% solo el modelo de actor. Puede usar simplemente el modelo de actor como una de sus muchas características.
BT
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.