Pregunta ¿Por qué los mensajes recibidos por un actor no están ordenados?


He estado estudiando el modelo de actor (específicamente la implementación en Scala), pero no puedo entender por qué hay un requisito de que los mensajes lleguen sin un orden en particular.

Parece que hay al menos algunas soluciones elegantes basadas en actores para los problemas de simultaneidad que funcionarían si solo los mensajes llegaran en orden (por ejemplo, variantes productor-consumidor, escrituras diferidas en la base de datos, cachés seguros en concurrencia).

Entonces, ¿por qué los mensajes de actores no llegan en orden? ¿Es para permitir una implementación eficiente o quizás para evitar algún tipo de estancamiento que surgiría cuando se ordenaran los mensajes?


10
2018-04-22 03:26


origen


Respuestas:


Mi impresión es que si dos hilos envían un mensaje a un actor a, no hay una garantía particular acerca de cuál será recibido por el actor primero. Pero si tienes un código que se parece a

a ! "one"
a ! "two"

entonces a siempre conseguirá "one" antes de "two" (aunque quién sabe qué más podría haber llegado de otros hilos).

Por lo tanto, no creo que sea el caso de que los mensajes lleguen en ningún orden particular en absoluto. Múltiples mensajes dentro de un hilo llegarán (por lo que puedo decir del código o de la experiencia) en orden.


12
2018-04-22 07:12



No tengo conocimiento de los motivos por los que los actores de Scala (los que están en la biblioteca estándar, en cualquier caso, también hay implementaciones Akka, Lift y Scalaz de Actores) eligieron esa implementación en particular. Probablemente como una copia de las propias restricciones de Erlang, pero sin las garantías para la comunicación entre dos hilos individuales. O tal vez con esa garantía también. Ojalá Phillip Haller estuviera aquí para comentar.

PERO, cuestiono su afirmación sobre problemas de simultaneidad. Al estudiar algoritmos distribuidos asíncronos, un principio básico es que no puedes garantizar ningún pedido de recibo de mensaje.

Citar Computación distribuida: Fundamentos, simulación y temas avanzados, por Hagit Attiya y Jennifer Welch,

Se dice que un sistema es asincrónico si no hay un límite superior fijo sobre cuánto tiempo   toma para que se entregue un mensaje o cuánto tiempo transcurre entre consecutivos   pasos de un procesador.

El modelo de actor es asincrónico. Eso le permite trabajar sobre hardware distribuido, ya sean diferentes computadoras que se comunican a través de una red, o diferentes procesadores en un sistema que no proporciona garantías sincrónicas.

Además, incluso el modelo de multi-threading en un procesador multi-core es principalmente asíncrono, con las primitivas que permiten que el sincronismo sea extremadamente caro.

Entonces, una respuesta simple a la pregunta podría ser:

No se garantiza que los mensajes lleguen en orden porque esa es una limitación subyacente de los sistemas asíncronos, que es el modelo básico de computación utilizado por los actores.

Este modelo es el que realmente tenemos en cualquier sistema distribuido a través de TCP / IP, y el más eficiente sobre el hardware multinúcleo / multiprocesador i386 / x64.


9
2018-04-22 15:25



El siguiente ejemplo simple muestra mensajes que llegan fuera de orden a un actor muy simple:

import scala.actors._
import scala.actors.Actor._
import scala.collection.mutable._

val adder = actor {
  loop {
    react {
      case x: Int => println(" Computing " + x); reply(x+2)
      case Exit => println("Exiting"); exit
    }
  }
}

actor {
  for (i <- 1 to 5) {
    println("Sending " + i)
    adder !! (i, { case answer => println("Computed " + i + " -> " + answer) })
  }

  println("Sending Exit")
  adder !! Exit
}

Aquí está el resultado de una ejecución del código anterior con Scala 2.9.0 final en Windows de 64 bits con Sun JDK 1.6.0u25:

Sending 1
Sending 2
Sending 3
Sending 4
Sending 5
Sending Exit
 Computing 1
Computed 1 -> 3
 Computing 4
Computed 4 -> 6
 Computing 3
Computed 3 -> 5
Exiting

3
2018-05-23 05:22



¿Qué orden elegirías? ¿Debería ser por cuándo fueron enviados o cuando fueron recibidos? ¿Deberíamos congelar todo el buzón mientras ordenamos los mensajes? Imagine ordenar un buzón grande y casi lleno, ¿no pondría eso un bloqueo arbitrario en la cola? Creo que los mensajes no llegan en orden porque no hay una manera garantizada de hacer cumplir tal orden. Tenemos latencia en las redes y entre los procesadores.

No tenemos idea de dónde vienen los mensajes, solo que han llegado. Entonces, ¿qué tal esto? Garantizamos que no tenemos pedidos y ni siquiera intentamos pensar en ordenar. En lugar de tener que idear una lógica impresionante para mantener las cosas organizadas y permanecer lo más libre de conflictos posible, podemos centrarnos en mantener las cosas lo más libres posible de contiendas.

Alguien más probablemente tenga una respuesta aún mejor que yo en esto.

Editar:

Ahora que he tenido tiempo de dormir, creo que es una estipulación que permite crear un ecosistema Actor mucho más vibrante. Por lo tanto, ¿por qué restringir un Actor o un hilo o propiedad parcial de un hilo de un grupo de hilos? ¿Qué pasaría si alguien quisiera tener un Actor que pudiera captar tantos hilos como sea posible para procesar tantos mensajes en su buzón como fuera posible?

Si hizo la estipulación por adelantado de que los mensajes debían hacerse en el orden en que procedían, nunca podría permitir esto. En el momento en que un Actor pueda asignar varios hilos para procesar los mensajes dentro del buzón, usted estaría en una situación en la que no tenía control sobre qué mensaje se procesó primero.

Uf, qué dicen tus sueños sobre tu mente mientras duermes.


2
2018-04-22 03:33