2012-04-25 16 views
9

Estaba leyendo un interesting blog post sobre Erlang y el modelo de actor. También escuché que scala admite el modelo de actor. De lo poco que he reunido hasta ahora, el modelo de actor descompone el procesamiento en componentes que se comunican entre sí transmitiendo mensajes. Típicamente, esos procesos son inmutables.es el modelo de actor limitado a idiomas específicos?

¿Son esas características específicas del lenguaje, o más, en el nivel de la arquitectura? más específicamente, ¿no puede simplemente implementar el mismo modelo de actor en casi cualquier idioma, y ​​simplemente usar alguna forma de cola de mensaje para pasar mensajes entre procesos de trabajo? (por ejemplo, use algo como celery). ¿O es que esos lenguajes como erlang y scala simplemente lo hacen de forma transparente y much faster?

Respuesta

12

Definitivamente puede definir una "Biblioteca de actores" en prácticamente cualquier idioma, pero en Erlang el modelo está integrado en el idioma y es realmente el único modelo de simultaneidad disponible.

Si bien el sistema de actores de Scala está bien implementado, al final del día, sigue siendo vulnerable a algunos riesgos de los que Erlang es inmune. Llamaré su atención sobre esto paper.

Este sería el caso para cualquier biblioteca Actor implementada en cualquier lenguaje imperativo que admita el estado mutable compartido.

Una excepción interesante a esto es Nodes.js. Se está trabajando con actores entre Nodos que probablemente exhiban las mismas propiedades de aislamiento que Erlang, simplemente porque no hay un estado mutable compartido.

+0

Gracias @dsmith. Eso es interesante. Entonces, si entiendo esto, el estado mutable compartido es la principal fuente de problemas.Hasta donde yo lo veo, cualquier arquitectura basada en cola de mensajes que transfiera tareas/datos serializados a procesos de trabajo debería, por lo tanto, ser prácticamente inmune a eso. Por lo tanto, ¿es compatible con el modelo de actor? Por lo tanto, ¿puede suponerse que, por ejemplo, apio ya implementa el modelo de actor? – gingerlime

+0

La clave es el aislamiento del estado mutable. Erlang aísla el estado mutable en procesos livianos. El estado de los nodos estaría aislado en los procesos del sistema operativo con un único hilo de ejecución. Y, sí, las soluciones de mensajería como apio/rabbitmq exhibirían las mismas cualidades. – dsmith

+0

Gracias de nuevo. Acepté su respuesta (junto con la información adicional proporcionada por @talg, que realmente lo completó). Obtuve una mejor imagen ahora sobre erlang y, sin embargo, es útil saber que el modelo de actor aún se puede implementar (aunque en una forma algo limitada) con algo como python/apio/rabbitmq, etc. – gingerlime

3

Actor modelo es no limitado a cualquier plataforma específica o lenguaje de programación, es solo un modelo después de todo.

Erlang y Scala tienen implementaciones realmente buenas y útiles de este modelo, que se adapta muy bien a la típica pila tecnológica de estas plataformas y ayuda a resolver eficazmente ciertos tipos de tareas.

0

No, no hay nada específico del idioma sobre el Actor Model. De hecho, ya mencionas Scala en tu pregunta, donde los actores no son parte del lenguaje, sino que se implementan como una biblioteca. (Tres competir bibliotecas, en realidad.)

Sin embargo, al igual que la programación funcional o de programación orientada a objetos, que tiene el apoyo directo de Programación Actor, o por lo menos soporte para algunas abstracciones que hacen que sea más fácil de implementar, en el idioma conducirá a una experiencia de programación muy diferente. Cualquiera que haya hecho Programación Funcional u Programación Orientada a Objetos en C probablemente lo entienda.

+0

Creo que su analogía con el uso de principios OOP en C programas es bueno. Es desafortunado que Scala eligió permitir un estado mutable sin restricciones. Algo más parecido a las referencias de Clojure hubiera sido mejor para Scala, pero puede haber elevado el listón de entrada para el desarrollador promedio de Java. – dsmith

1

Para agregar a los puntos mencionados anteriormente, el hecho de que en el modelo de actor Erlang es la única forma en que puede programar, hace que su código sea escalable desde el primer momento. Los procesos de Erlang son livianos, y puedes generar 10-100K en una máquina (no creo que puedas hacerlo con python), esto cambia la forma en que abordas los problemas. Por ejemplo, en nuestro producto analizamos los registros del servidor web con Erlang y generamos un proceso Erlang para manejar cada línea. De esta forma, si una línea de registro está dañada o el proceso que la maneja falla, nada les sucede a los demás. Otra diferencia es que cuando comienzas a utilizar OTP obtienes supervisores de procesos y puedes hacer que los procesos estén conectados, de modo que si uno termina, todos los demás lo hacen. Aparte de eso, Erlang tiene otra característica interesante (que se puede encontrar en otros idiomas a través de las bibliotecas, pero de nuevo aquí está integrada) como la coincidencia de patrones y la implementación en caliente.

+0

De hecho, el hecho de que la implementación del actor se basa en procesos extremadamente ligeros y que puede generar rápidamente cientos de miles de estas unidades de actores en un solo proceso de sistema operativo, hace que Erlang sea único. Otras implementaciones que usan procesos o subprocesos de SO pesados ​​son limitadas. – dsmith

+0

Uniendo esas dos respuestas juntas obtengo una imagen mucho más clara ahora. Engendrar un proceso para cada línea de registro suena loco, pero parece una muy buena ilustración de un cambio masivo en los problemas que se avecinan. Ciertamente, no es algo que intente en Python. Y estoy de acuerdo en que ser * forzado * por el idioma para que solo funcione de esta manera puede ser ventajoso. ¡Gracias a ambos por hacer las cosas mucho más claras! – gingerlime

Cuestiones relacionadas