gpt4 book ai didi

Scala - 如何使用计时器而不阻塞 Futures 与 Await.result

转载 作者:行者123 更新时间:2023-12-01 11:15:16 24 4
gpt4 key购买 nike

我有一个由 akka-http 提供的 Rest API。在某些情况下,我需要从外部数据库 (Apache HBase) 获取数据,如果数据库传送数据的时间过长,我希望查询失败。

一种天真的方法是将调用包装在 Future 中,然后使用具有所需持续时间的 Await.result 阻止它。

import scala.concurrent.duration._
import scala.concurrent.{Await, Future}

object AsyncTest1 extends App {

val future = Future {
getMyDataFromDB()
}

val myData = Await.result(future, 100.millis)
}

这似乎是低效的,因为这个实现需要两个线程。有没有一种有效的方法来做到这一点?

我有另一个用例,我想并行发送多个查询,然后聚合结果,具有相同的延迟限制。

val future1 = Future {
getMyDataFromDB1()
}

val future2 = Future {
getMyDataFromDB2()
}

val foldedFuture = Future.fold(
Seq(future1, future2))(MyAggregatedData)(myAggregateFunction)
)

val myData = Await.result(foldedFuture, 100.millis)

同样的问题,什么是最有效的实现方式?

谢谢你的帮助

最佳答案

一个解决方案是使用 Akka 的 after 函数,它可以让你传递一个持续时间,之后 future 会抛出异常或任何你想要的。

看看here .它演示了如何实现这一点。

编辑:我想我会在这里发布代码以防将来链接断开:

import scala.concurrent._
import scala.concurrent.duration._
import ExecutionContext.Implicits.global
import scala.util.{Failure, Success}
import akka.actor.ActorSystem
import akka.pattern.after

val system = ActorSystem("theSystem")

lazy val f = future { Thread.sleep(2000); true }
lazy val t = after(duration = 1 second, using = system.scheduler)(Future.failed(new TimeoutException("Future timed out!")))

val fWithTimeout = Future firstCompletedOf Seq(f, t)

fWithTimeout.onComplete {
case Success(x) => println(x)
case Failure(error) => println(error)
}

关于Scala - 如何使用计时器而不阻塞 Futures 与 Await.result,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47574526/

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