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已经回答了这个. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |