这就是我现在正在尝试但它只打印"嘿"而不是指标.我不想在main函数中添加与度量相关的东西.
import java.util.Date
import monix.eval.Task
import monix.execution.Scheduler.Implicits.global
import scala.concurrent.Await
import scala.concurrent.duration.Duration
class A {
def fellow(): Task[Unit] = {
val result = Task {
println("hey")
Thread.sleep(1000)
}
result
}
}
trait AA extends A {
override def fellow(): Task[Unit] = {
println("AA")
val result = super.fellow()
val start = new Date()
result.foreach(e => {
println("AA", new Date().getTime - start.getTime)
})
result
}
}
val a = new A with AA
val res: Task[Unit] = a.fellow()
Await.result(res.runAsync, Duration.Inf)
Run Code Online (Sandbox Code Playgroud)
你可以描述一个这样的函数:
def measure[A](task: Task[A], logMillis: Long => Task[Unit]): Task[A] =
Task.deferAction { sc =>
val start = sc.clockMonotonic(TimeUnit.MILLISECONDS)
val stopTimer = Task.suspend {
val end = sc.clockMonotonic(TimeUnit.MILLISECONDS)
logMillis(end - start)
}
task.redeemWith(
a => stopTimer.map(_ => a)
e => stopTimer.flatMap(_ => Task.raiseError(e))
)
}
Run Code Online (Sandbox Code Playgroud)
一些建议:
Task值应该是纯的,以及返回Tasks 的函数- 触发副作用的函数,并Task在结果被破坏时
返回Task不是1:1的替代品Future; 在描述a时Task,应暂停(包裹)所有副作用Taskforeach触发了Task评估并且这不好,因为它会引发副作用; 我正在考虑弃用和删除它,因为它的存在很诱人new Date(),你需要一个单调的时钟是和那就是JVM之上System.nanoTime,可以通过Monix的访问Scheduler通过clockMonotonic,如上述举例中,Scheduler经由给你deferActionThread.sleep,做Task.sleep和所有Await.result调用都是有问题的,除非它们在main或不可能处理异步的其他地方希望这可以帮助.
干杯,
| 归档时间: |
|
| 查看次数: |
467 次 |
| 最近记录: |