gpt4 book ai didi

scala - Akka、 future 和临界区

转载 作者:行者123 更新时间:2023-12-04 22:31:05 24 4
gpt4 key购买 nike

假设我们有一个 Akka actor,它根据 var 维护一个内部状态。

class FooActor extends Actor {
private var state: Int = 0

def receive = { ... }
}

假设接收处理程序调用一个返回 future 的操作,我们使用调度程序作为上下文执行器映射它,最后我们设置一个 onSuccess 回调来改变角色状态。
import context.dispatcher
def receive = {
case "Hello" => requestSomething() // asume Future[String]
.map(_.size)
.onSuccess { case i => state = i }
}

onSuccess 回调中改变 actor 的状态是否是线程安全的,即使使用 actor 调度器作为执行上下文?

最佳答案

不,不是(akka 2.3.4 documentation )。

在这种情况下,您必须做的是向 self 发送消息以更改状态。如果您需要订购,您可以使用 stash 并成为。像这样的东西

import akka.actor.{Stash,Actor}
import akka.pattern.pipe
case class StateUpdate(i:int)
class FooActor extends Actor with Stash{
private var state: Int = 0
def receive = ready
def ready = {
case "Hello" => requestSomething() // asume Future[String]
.map(StateUpdate(_.size)) pipeTo self
become(busy)
}
def busy {
case StateUpdate(i) =>
state=i
unstashAll()
become(ready)
case State.Failure(t:Throwable) => // the future failed
case evt =>
stash()
}
}

当然,这是一个简单的实现,您可能希望处理超时和其他事情以避免让您的 Actor 卡住。

如果您的州不需要订购保证:
case class StateUpdate(i:int)
class FooActor extends Actor with Stash{
private var state: Int = 0
def receive = {
case "Hello" => requestSomething() // asume Future[String]
.map(StateUpdate(_.size)) pipeTo self
case StateUpdate(i) => state=i
}

但是参与者状态可能不是收到的最后一个字符串的长度

关于scala - Akka、 future 和临界区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25198926/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com