Pregunta sobre actor, scala – ¿Es una mala práctica enviar a un actor un mensaje de algo que no es un actor?

10

Supongamos que tengo alguna clase que tiene una propiedad.actor_ de tipoActor. Hay un problema conmigo haciendo

def someMethod() = {
  actor_ ! "HELLO"
}

O debería enviar un mensaje siempre de otro actor; p.ej.

def someMethod() = {
  Actor.actor { actor_ ! "HELLO" }
}

Tu respuesta

2   la respuesta
0

¿por qué no? Si miras el modelo de actor puro, todo es un actor y solo los actores se comunican entre sí, si puedes diseñar tu código como este ... genial ... si no puedes o no quieres, entonces está bien enviar Mensajes de no actores a actores.

El remitente sería un ActorProxy creado implícitamente que ahora está vinculado al hilo de envío. Erik Engbrecht
No estoy muy seguro. Después de todo, en la reacción, ¿qué sería "remitente"? oxbow_lakes
8

actor, se crea automáticamente un ActorProxy y se almacena en un subproceso local. Esto crea una pérdida potencial de memoria, aunque sea muy pequeña, ya que el ActorProxy no tendrá GC'd hasta que el hilo esté en GC'd. El ActorProxy esencialmente permite que el subproceso que no es actor se comporte de muchas maneras como un Actor, incluido el mensaje de recepción.

El mayor problema es si su hilo se está administrando, de manera similar a la forma en que la biblioteca de actores administra los hilos, de modo que lo que representa un contexto lógico puede estar en un momento en un hilo y en otro tiempo en otro hilo. Un buen ejemplo de esto sería un contenedor servlet. Su contexto lógico puede ser un servlet o una sesión, pero el ActorProxy se vinculará al hilo y, por lo tanto, se compartirá en contextos lógicos. Si sus actores no están respondiendo al ActorProxy, esto no es tan importante, pero si lo son, probablemente se generen problemas porque: (a) las respuestas serán recibidas por el contexto incorrecto, o (b) el los mensajes nunca se reciben y, por lo tanto, la pequeña fuga mencionada anteriormente se convierte en una grande a medida que se llenan los buzones de los ActorProxies.

[Editar] Hmm ... ¡Parece que tengo problemas para leer las preguntas! Al rodearlo en el bloque de actor, se crea un nuevo objeto de actor que se realizará correctamente cuando finalice. Tenga en cuenta que colocar el mensaje enviado en un bloque de actor significa que el envío de mensaje se realizará en una nueva reacción en otro hilo, no en el hilo que crea el actor.

Gran respuesta, Eric, gracias. ¿El envolver la invocación en un bloque "actor {}" (como en mi pregunta) sufre el mismo problema? ¿O es el actor creado GC-capaz cuando el bloque sale, independientemente de si el hilo vive? oxbow_lakes

Preguntas relacionadas