Scala未来序列和超时处理
发布时间:2020-12-16 18:59:27 所属栏目:安全 来源:网络整理
导读:如何结合期货 with timeouts有一些很好的提示. 但是我很好奇如何用Future sequence sequenceOfFutures做到这一点 我的第一种方法看起来像这样 import scala.concurrent._import scala.concurrent.duration._import scala.concurrent.ExecutionContext.Implic
如何结合期货
with timeouts有一些很好的提示.
但是我很好奇如何用Future sequence sequenceOfFutures做到这一点 我的第一种方法看起来像这样 import scala.concurrent._ import scala.concurrent.duration._ import scala.concurrent.ExecutionContext.Implicits._ object FutureSequenceScala extends App { println("Creating futureList") val timeout = 2 seconds val futures = List(1000,1500,1200,800,2000) map { ms => val f = future { Thread sleep ms ms toString } Future firstCompletedOf Seq(f,fallback(timeout)) } println("Creating waitinglist") val waitingList = Future sequence futures println("Created") val results = Await result (waitingList,timeout * futures.size) println(results) def fallback(timeout: Duration) = future { Thread sleep (timeout toMillis) "-1" } } 有没有更好的方法来处理一系列期货中的超时或这是一个有效的解决方案? 解决方法
您的代码中有一些内容可能需要重新考虑.对于初学者来说,我不是将任务提交到ExecutionContext中的忠实粉丝,其唯一目的是模拟超时并且还使用了Thread.sleep.睡眠调用是阻塞的,您可能希望避免在执行上下文中有一个任务,为了等待一段固定的时间而完全阻塞.我将从我的答案
here中窃取,并建议对于纯超时处理,你应该使用我在答案中概述的内容. HashedWheelTimer是一个高效的计时器实现,比只是睡眠的任务更适合超时处理.
现在,如果你走这条路线,下一次改变我会建议处理每个未来的个别超时相关故障.如果您希望单个故障完全失败,则从序列调用返回的聚合Future,则不执行任何额外操作.如果您不希望发生这种情况,而是希望超时返回一些默认值,那么您可以在Future上使用recover,如下所示: withTimeout(someFuture).recover{ case ex:TimeoutException => someDefaultValue } 完成后,您可以利用非阻塞回调并执行以下操作: waitingList onComplete{ case Success(results) => //handle success case Failure(ex) => //handle fail } 每个未来都有一个超时,因此不会无限运行.没有必要IMO阻止那里并通过atMost参数向Await.result提供额外的超时处理层.但我想这可以假设你对非阻塞方法没问题.如果你真的需要在那里阻止,那么你不应该等待超时* futures.size的时间量.这些期货并行运行;那里的超时应该只需要与期货本身的个别超时一样长(或者只是稍微长一点来解释cpu /时间的任何延迟).它当然不应该是超时*期货的总数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |