本地actor和远程actor之间的行为不一致

时间:2011-12-11 20:21:08

标签: scala closures akka actor

这是对Scala variable binding when used with Actors

早期问题的跟进

反对其他人的建议,我决定制作一个包含闭包的消息,并改变消息之间关闭闭包的变量..并明确地等待它们。 环境是scala 2.9上的akka​​ 1.2

考虑以下

var minAge = 18
val isAdult = (age: Int) => age >= minAge

println((actor ? answer(19, isAdult)).get) 
minAge = 20
println((actor ? answer(19, isAdult)).get) 

回答的消息处理程序基本上将isAdult应用于第一个参数(19)。 当演员是本地人时,我得到了我期望的答案。

true
false

但是当它很遥远时,我得到了

false
false

我只是好奇为什么这会是这种行为?我原本预计两者之间会有一致的行为。

提前致谢!

2 个答案:

答案 0 :(得分:2)

嗯,您已经遇到过可能(或可能不)被认为是系统的问题,其中行为由未由该语言强制执行的规则指定。 Java中也发生过同样的事情。这里:

  1. 客户:Data d = rmiServer.getSomeData();
  2. 客户:d.mutate()
  3. 您是否预计服务器上也会发生突变?涉及远程通信的任何系统的一个基本问题,特别是当该通信对客户端透明时,是了解通信发生的位置以及正在发生的事情。

    • 与演员的沟通采取消息传递的形式
    • 效果只能通过消息传递机制传递边界(即效果必须位于返回的值中)
    • 演员库可以透明地处理远程传输消息
    • 如果你的效果不是信息,那就不会发生!

答案 1 :(得分:1)

你在这里遇到的是我称之为Scala闭包的“贪婪”:他们从不关闭“按价值”,大概是因为统一访问原则。这意味着闭包包含$outer引用,用于获取minAge的值。你没有提供足够的上下文来展示你的测试中$outer的样子,因此我无法更准确地说明它是如何序列化的,从中可以看出为什么它会打印出你所展示的内容。

但是,有一个词:请不要像这样发送闭包。当你承认自己时,这不是幸福的秘诀。