gpt4 book ai didi

scala - 在 Akka Actors 中使用 Futures

转载 作者:行者123 更新时间:2023-12-03 21:23:56 26 4
gpt4 key购买 nike

我刚刚开始在 Scala 中学习 Akka Actors。我的理解是Actor收到的消息在Actor的邮箱中排队,一次处理一个。通过一次处理一条消息,可以缓解并发问题(竞争条件、死锁)。

但是,如果 Actor 创建了一个 Future 来完成与消息相关的工作,会发生什么?由于 future 是异步的,当与前一条消息关联的 future 仍在运行时,Actor 可以开始处理接下来的几条消息。这不会潜在地造成竞争条件吗?如何在 Actor 的 receive() 方法中安全地使用 future 来执行长时间运行的任务?

最佳答案

在 actor 中使用 future 的最安全方法是只使用 pipeTo在 future 并将其结果作为消息发送给 Actor (可能是同一个 Actor )。

import akka.pattern.pipe

object MyActor {

def doItAsynchronously(implicit ec: ExecutionContext): Future[DoItResult] = {
/* ... */
}

}

class MyActor extends Actor {

import MyActor._
import context.dispatcher

def receive = {
case DoIt =>
doItAsynchronously.pipeTo(self)
case DoItResult =>
// Got a result from doing it
}

}

这可确保您不会改变 actor 内的任何状态。

关于scala - 在 Akka Actors 中使用 Futures,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22790543/

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