下面是一个等待可取消的未来的简单程序。未来要估等20秒。我在演示5。第二个最大时限开始了。然而,这个程序似乎忽略了5。Second最大时间限制,等待20秒。有人知道这是为什么吗?由于
import com.github.nscala_time.time.Imports.{DateTime, richReadableInstant, richReadableInterval}
import monix.eval.Task
import monix.execution.Scheduler
import monix.execution.Scheduler.Implicits.global
import scala.concurrent.duration._
import scala.concurrent.Await
object TaskRunToFuture extends App {
def waitTwenty = {
val start = DateTime.now()
while ((start to DateTime.now()).millis < 20000) { /** do nothing */ }
}
val result = Await.result(Task.eval(waitTwenty).runToFuture, 5.seconds)
}
From Monix's Design Summary:
不一定在另一个逻辑线程上执行
在你的例子中,你定义了一个任务,它本身没有任何"异步边界"。这将迫使Monix转移到另一个线程,所以当您调用runToFuture
时,它最终会在当前线程上执行waitTwenty
。因此,当Future实际返回时,任务已经完成,因此直到20秒结束时才实际调用Await.result
。
参见Task#executeAsync
,在任务前插入异步边界,例如Task.eval(waitTwenty).executeAsync.runToFuture
通常这种事情不是一个问题,因为你通常不想调用任何run*
方法,除非在你的应用程序的main
;相反,你将根据Task
组合所有内容,因此整个应用程序最终是一个可以运行的大型Task
,例如作为TaskApp
。
def waitTwenty = {
println("starting wait...")
Thread.sleep(20000)
println("done waiting!")
}
Await.result(Task.eval(waitTwenty).executeAsync.runToFuture, 5.seconds)
输出waiting...
java.util.concurrent.TimeoutException: Future timed out after [5 seconds]
at scala.concurrent.impl.Promise$DefaultPromise.tryAwait0(Promise.scala:248)
at scala.concurrent.impl.Promise$DefaultPromise.result(Promise.scala:261)
at monix.execution.CancelableFuture$Async.result(CancelableFuture.scala:371)
at scala.concurrent.Await$.$anonfun$result$1(package.scala:201)
at scala.concurrent.BlockContext$DefaultBlockContext$.blockOn(BlockContext.scala:62)
at scala.concurrent.Await$.result(package.scala:124)
... 59 elided