Pergunta sobre scala, actor – É uma prática ruim enviar ao ator uma mensagem de algo que não é um ator?

10

Suponha que eu tenha alguma classe que tenha uma propriedadeactor_ do tipoActor. Existe algum problema comigo

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

Ou deveria enviar uma mensagem sempre ser feita de outro ator; por exemplo.

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

Sua resposta

2   a resposta
0

então porque não? Se você olhar para o modelo de ator puro, tudo é um ator e somente os atores estão se comunicando entre si, se você pode projetar seu código como este ... ótimo ... se você não puder ou não quiser, então tudo bem enviar mensagens de não atores para atores.

Remetente seria um ActorProxy implicitamente criado que agora está vinculado ao segmento de envio. Erik Engbrecht
Eu não tenho tanta certeza. Afinal, na reação, o que seria "remetente"? oxbow_lakes
8

o que não é do ator, um ActorProxy é criado e armazenado automaticamente em um segmento local. Isso cria um possível vazamento de memória, ainda que muito pequeno, porque o ActorProxy não será solicitado pelo GC até que o thread seja roteado para GC. O AtorProxy essencialmente permite que o segmento de não ator, de muitas maneiras, se comporte como um Ator, incluindo o recebimento de mensagens.

O problema maior é se o seu segmento está sendo gerenciado, semelhante à maneira como a biblioteca de atores gerencia os threads, de modo que o que representa um contexto lógico pode estar em um momento em um thread e em outro tempo estar em outro thread. Um bom exemplo disso seria um contêiner servlet. Seu contexto lógico pode ser um servlet ou uma sessão, mas o ActorProxy será vinculado ao thread e, portanto, compartilhado em contextos lógicos. Se seus atores não estão respondendo ao ActorProxy, isso não é um grande problema, mas se forem, isso provavelmente causará problemas porque (a) as respostas serão potencialmente recebidas pelo contexto errado, ou (b) as mensagens nunca são recebidas e, portanto, o pequeno vazamento mencionado anteriormente se torna grande, conforme as caixas de correio dos ActorProxies são preenchidas.

[Edit] Hmm ... parece que tenho um problema ao ler perguntas! Envolvê-lo no bloco de atores cria um novo objeto de ator que será devidamente GC'd quando terminar. Tenha em mente que colocar a mensagem enviada em um bloco de ator significa que a mensagem enviada será feita em uma nova reação em outro encadeamento, não no encadeamento que cria o ator.

Ótima resposta, Eric, obrigado. Envolver a invocação em um bloco "ator {}" (como na minha pergunta) sofre do mesmo problema? Ou o ator criado é capaz de GC quando o bloco sai, independentemente de o thread estar ligado? oxbow_lakes

Perguntas relacionadas