【问题标题】:akka closing over senderakka 关闭发件人
【发布时间】:2017-05-22 01:10:23
【问题描述】:

试图了解以下使用 sender 是否安全。 我在一些posts 上看到关闭发件人是不安全的,但如果调用是by value,则在调用该方法时会评估 sender(),对吗? 以下模式安全吗?

1.

context.system.scheduler.scheduleOnce(1 second, self, "foo")(executor = context.dispatcher, sender = sender())

2.

def receive: Receive = {
    case "Process" => context.become(processing(sender())
}
def processing(replyTo: ActorRef): receive = {...}

3.

def receive: Receive = {
case "Process" => 
context.actorOf(Props(new FooActor(replyTo = sender())))
}

【问题讨论】:

  • 1 和 2 是安全的,但不是 3。请参阅 Props.apply 的签名。

标签: scala akka


【解决方案1】:

当人们对 sender() 函数说“关闭”时,他们的意思是将“this”引用捕获到 lambda 中,以便稍后调用 sender()。这是不安全的,因为稍后 sender() 返回的值将与它当前拥有的值不同。如果你捕获(或“关闭”)sender() 当前返回的值,那很好。

您是否将 sender() 捕获为函数或将 sender() 捕获为值并不总是很清楚,因为它会根据您将其传递给按值调用还是按名称调用而有所不同正如您所指出的那样。

正如维克托在评论中指出的那样:

1 和 2 很好,因为您正在捕获 sender() 的当前值。

3 不安全,因为“Props.apply”是一个按名称传递的函数,所以您无意中将 sender() 作为函数而不是值关闭。

我不知道有什么简单的方法可以区分这两种情况,除了检查文档(或者在你的 IDE 中点击,如果它支持的话)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 2021-07-25
    相关资源
    最近更新 更多