gpt4 book ai didi

Scala Futures - 内置超时?

转载 作者:行者123 更新时间:2023-12-03 05:51:17 24 4
gpt4 key购买 nike

我从官方教程引用文献中无法完全理解 future 的一个方面。 http://docs.scala-lang.org/overviews/core/futures.html

scala 中的 future 是否有某种内置的超时机制?假设下面的示例是一个 5 GB 的文本文件...“Implicits.global”的隐含范围最终会导致 onFailure 以非阻塞方式触发还是可以定义?如果没有某种默认超时,这是否意味着成功或失败都不会触发?

import scala.concurrent._
import ExecutionContext.Implicits.global

val firstOccurence: Future[Int] = future {
val source = scala.io.Source.fromFile("myText.txt")
source.toSeq.indexOfSlice("myKeyword")
}
firstOccurence onSuccess {
case idx => println("The keyword first appears at position: " + idx)
}
firstOccurence onFailure {
case t => println("Could not process file: " + t.getMessage)
}

最佳答案

只有当您使用阻塞来获取 Future 的结果时,才会出现超时行为。如果您想使用非阻塞回调 onCompleteonSuccessonFailure,那么您必须自行进行超时处理。 Akka 内置了针对 Actor 之间的请求/响应 (?) 消息传递的超时处理,但不确定您是否要开始使用 Akka。 FWIW,在 Akka 中,为了处理超时,它们通过 Future.firstCompletedOf 组合两个 Future,一个代表实际的异步任务,一个代表超时。如果超时计时器(通过 HashedWheelTimer)首先弹出,则异步回调会失败。

一个非常简单的自己动手的例子可能是这样的。首先,一个用于调度超时的对象:

import org.jboss.netty.util.{HashedWheelTimer, TimerTask, Timeout}
import java.util.concurrent.TimeUnit
import scala.concurrent.duration.Duration
import scala.concurrent.Promise
import java.util.concurrent.TimeoutException

object TimeoutScheduler{
val timer = new HashedWheelTimer(10, TimeUnit.MILLISECONDS)
def scheduleTimeout(promise:Promise[_], after:Duration) = {
timer.newTimeout(new TimerTask{
def run(timeout:Timeout){
promise.failure(new TimeoutException("Operation timed out after " + after.toMillis + " millis"))
}
}, after.toNanos, TimeUnit.NANOSECONDS)
}
}

然后是一个接受 Future 并向其添加超时行为的函数:

import scala.concurrent.{Future, ExecutionContext, Promise}
import scala.concurrent.duration.Duration

def withTimeout[T](fut:Future[T])(implicit ec:ExecutionContext, after:Duration) = {
val prom = Promise[T]()
val timeout = TimeoutScheduler.scheduleTimeout(prom, after)
val combinedFut = Future.firstCompletedOf(List(fut, prom.future))
fut onComplete{case result => timeout.cancel()}
combinedFut
}

请注意,我在这里使用的 HashedWheelTimer 来自 Netty。

关于Scala Futures - 内置超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16304471/

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