gpt4 book ai didi

scala - 如何在不阻塞的情况下使用 Akka 询问模式

转载 作者:行者123 更新时间:2023-12-04 16:48:52 25 4
gpt4 key购买 nike

您好,我有一个 actor 负责从数据库中获取数据,将其转换为列表并将其发回给发送者。我正在使用 ask 模式来接收来 self 的 Actor 的响应,因为我不想使用 await.result 因为这种方法会阻塞不好的线程。

我编写了以下代码来获取我的 Actor 的响应(我只是跳过了数据库代码以保持简单但逻辑保持不变):

class MyActor extends Actor{
var list = new MutableList[Int]()
list+=1
list+=2
list+=3
list+=4

def receive ={
case "returnAlist"=>
println("sending back list "+list +"of size "+list.size)
sender ! list
case message =>
unhandled(message)
}
}

object Test extends App{
val system = ActorSystem("testing")
val MyActor = system.actorOf(Props[MyActor], name = "InstitutionUserSuggestion")
implicit val timeout = Timeout(15 seconds)
var ResultList = new MutableList[Int]()
val future:Future[MutableList[Int]] = ask(MyActor,"returnAlist").mapTo[MutableList[Int]]
future.onComplete {
case Success(result)=>
println(" in sucees start")
println("value of result "+ result.size)
println("ResultList=result")
ResultList = result
println("value of ResultList "+ ResultList.size)
println("in Success end")
case Failure(e)=>
println(" in failure")
e.printStackTrace()
}

println("returned list size is " + ResultList.size + " and its contents" + ResultList)


}

下面是上面代码的输出:

sending back list MutableList(1, 2, 3, 4)of size 4
returned list size is 0 and its contenstsMutableList()
in sucees start
value of result 4
ResultList=result
value of ResultList 4
in Success end

我的问题是 onComplete 代码在最后执行 我需要在控制台上显示列表 ResultList 的内容但是这一行

println("returned list size is "+ResultList.size +" and its contensts" +ResultList)

我在 onComplete block 之后写的我认为它在 onComplete block 之前执行,所以最后 ResultList 列表中没有任何内容>,所以我无法将其项目打印到控制台。

请帮帮我,我应该怎么做才能在不阻塞的情况下从 Actor 那里接收项目列表,然后将其显示在控制台上。

最佳答案

您不想通过等待参与者的响应来阻塞,因此您正确地使用了 Future。当您的 actor 响应列表时,onComplete 函数中的代码将被执行。

并且由于您不想异步阻塞和处理它,所以您的最后一个 println 语句会在您的 actor 尚未响应时执行。

您可以在onComplete block 中打印列表的内容:

object Test extends App{
val system = ActorSystem("testing")
val MyActor = system.actorOf(Props[MyActor], name = "InstitutionUserSuggestion")
implicit val timeout = Timeout(15 seconds)

val future: Future[List[Int]] = ask(MyActor,"returnAlist").mapTo[List[Int]]
future.onComplete {
case Success(result)=>
println("returned list size is " + result.size +" and its contents" + result)
case Failure(e)=>
println("in failure")
e.printStackTrace()
}
}

作为旁注,我使用了一个不可变的 List,它比使用可变集合(如 MutableList)更符合 Scala 的习惯。

关于scala - 如何在不阻塞的情况下使用 Akka 询问模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31001162/

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