加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 并行运行多个期货,超时返回默认值

发布时间:2020-12-16 09:01:46 所属栏目:安全 来源:网络整理
导读:我必须并行运行多个期货,程序不应该崩溃或挂起. 现在我一个个等待期货,如果有TimeoutException,则使用回退值. val future1 = // start future1val future2 = // start future2val future3 = // start future3// - at this point all 3 futures are running//
我必须并行运行多个期货,程序不应该崩溃或挂起.

现在我一个个等待期货,如果有TimeoutException,则使用回退值.

val future1 = // start future1
val future2 = // start future2
val future3 = // start future3

// <- at this point all 3 futures are running

// waits for maximum of timeout1 seconds
val res1 = toFallback(future1,timeout1,Map[String,Int]())
// .. timeout2 seconds 
val res2 = toFallback(future2,timeout2,List[Int]())
// ... timeout3 seconds
val res3 = toFallback(future3,timeout3,BigInt]()) 

def toFallback[T](f: Future[T],to: Int,default: T) = {
  Try(Await.result(f,to seconds))
    .recover { case to: TimeoutException => default }
}

如我所见,此片段的最大等待时间为timeout1 timeout2 timeout3

我的问题是:如何等待所有这些期货一次,所以我可以减少等待时间max(timeout1,timeout3)?

编辑:最后我用@Jatin和@senia的修改答案:

private def composeWaitingFuture[T](fut: Future[T],timeout: Int,default: T) =
  future { Await.result(fut,timeout seconds) } recover {
    case e: Exception => default
  }

后来使用如下:

// starts futures immediately and waits for maximum of timeoutX seconds
val res1 = composeWaitingFuture(future1,Int]())
val res2 = composeWaitingFuture(future2,List[Int]())
val res3 = composeWaitingFuture(future3,BigInt]()) 

// takes the maximum of max(timeout1,timeout3) to complete
val combinedFuture =
  for {
    r1 <- res1
    r2 <- res2
    r3 <- res3
  } yield (r1,r2,r3)

后来我使用combinedFuture,我认为合适.

解决方法

def toFallback[T](f: Future[T],default: T) = {
  future{
  try{
        Await.result(f,to seconds)
   }catch{
        case e:TimeoutException => default
  }
 }

您甚至可以使此块异步,并且每个请求等待其最大时间.如果线程太多,可能有一个线程使用Akka的系统调度器继续检查其他期货. @Senia已经回答了这个.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读