gpt4 book ai didi

scala - 获取响应时间

转载 作者:可可西里 更新时间:2023-11-01 17:36:10 35 4
gpt4 key购买 nike

是否有一种简单的方法来获取对 url 请求的响应时间(而不是在代码中单独跟踪时间)?

import dispatch._, Defaults._
import scala.util.{Failure, Success}

val svc = dispatch.url(url)
val response: Future[com.ning.http.client.Response] = Http(svc > (x => x))
response onComplete {
case Success(content) => {
println(s"SUCCESS: ${content.getStatusCode()} for $url")
//how long did this take??
}
case Failure(t) => {
println(s"ERROR: timeout/failure for $url")
}
}

最佳答案

这是一种不同的计算耗时的方法,可能需要更多的定制(比如处理失败,NonFatal 最有可能),但我认为这更符合惯用方式。不过,它仅适用于 Future

首先为带时间的结果创建一个类(也可以用元组替换),为带时间的失败创建一个类。

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

case class ResultWithTime[ResultType](val result: ResultType, val time: Long)

class FailureWithTime(failure: Throwable, val time: Long) extends Throwable(failure)

然后创建一个包装 future 以执行并处理失败情况的方法(如果您不喜欢 Future,可以使用 Promise maprecoverWith 方法(因为它们需要一个隐式的 ExecutionContext)。

object TimerFuture {
def apply[ResultType](fut: =>Future[ResultType]): Future[ResultWithTime[ResultType]] = {
val startTime = System.currentTimeMillis
fut.map(r => ResultWithTime(r, System.currentTimeMillis - startTime))
.recoverWith{case t:Throwable =>
Future.failed(new FailureWithTime(t, System.currentTimeMillis - startTime))
}
}
}

这是一个如何使用它的例子:

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.io.StdIn


object Y extends App {
TimerFuture(Future{Thread.sleep(200); "Hello"})
.onSuccess({case ResultWithTime(r, t) => println(s"Took $t ms to get: $r")})
TimerFuture(Future{Thread.sleep(100); throw new NullPointerException()})
.onFailure({case f: FailureWithTime => println(s"Took ${f.time} ms to get: ${f.getCause}")})
StdIn.readLine()
}

关于scala - 获取响应时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30753255/

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