gpt4 book ai didi

scala - 使用 Akka 的 Actors 进行异步消息处理

转载 作者:行者123 更新时间:2023-12-04 18:40:35 24 4
gpt4 key购买 nike

在我的项目中,我使用的是 Akka 的 Actors。根据定义,Actor 是线程安全的,这意味着在 Actor 的receive 方法

def receive = {
case msg =>
// some logic here
}

一次只有一个线程处理被注释的代码段。然而,当这段代码是异步的时,事情开始变得更加复杂:

def receive = {
case msg =>
Future {
// some logic here
}
}

如果我理解正确,在这种情况下,可以说只有 Future 结构会被同步,而不是 Future 内部的逻辑。

当然我可以阻止 Future:

def receive = {
case msg =>
val future = Future {
// some logic here
}
Await.result(future, 10.seconds)
}

这解决了问题,但我认为我们都应该同意这不是一个可以接受的解决方案。

所以这是我的问题:在异步计算的情况下,如何阻塞 Scala 的 Futures 来保留 actor 的线程安全特性?

最佳答案

How can I retain the thread-safe nature of actors in case of asynchronous computing without block Scalas Future?

只有当您在 Future 中修改 actor 的内部状态时,这个假设才成立,这似乎首先是一种设计味道。仅通过创建数据的副本 并使用pipeTo 将计算结果通过管道传递给参与者,从而将 future 用于计算。一旦 actor 收到计算结果,您就可以安全地对其进行操作:

import akka.pattern.pipe

case class ComputationResult(s: String)

def receive = {
case ComputationResult(s) => // modify internal state here
case msg =>
Future {
// Compute here, don't modify state
ComputationResult("finished computing")
}.pipeTo(self)
}

关于scala - 使用 Akka 的 Actors 进行异步消息处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42360766/

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