加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么scala Await.result在两次传递相同的未来时会在repl中超时

发布时间:2020-12-16 18:16:29 所属栏目:安全 来源:网络整理
导读:我发现这有点令人困惑.我认为 scala中的future是一次设置的不可变容器,总是返回相同的值. 所以我有一个未来: val y = future {Thread.sleep(1000); 1}; 现在当我立即(在未来解决之前)将它传递给Await.result块两次: Await.result(for (r1 - y; r2 - y) yie
我发现这有点令人困惑.我认为 scala中的future是一次设置的不可变容器,总是返回相同的值.

所以我有一个未来:

val y = future {Thread.sleep(1000); 1};

现在当我立即(在未来解决之前)将它传递给Await.result块两次:

Await.result(for (r1 <- y; r2 <- y) yield (r1,r2),60 seconds)

我得到一个TimetoutException.

但是,如果我在未来解决后这样做,一切正常并按预期返回(1,1).

这种行为的原因是什么?

编辑:
我正在使用隐式ExecutionContext.Implicits.global和scala.concurrent @scala 2.10.3

EDIT2:
如果我创建另一个未来的实例做同样的事情,并对它们做Await.result它都不会阻止.

解决方法

只是为了补充堆栈跟踪,当闭包类需要X.z时它会失败:

apm@mara:~$goof
Welcome to Scala version 2.11.0-RC3 (OpenJDK 64-Bit Server VM,Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import scala.concurrent._
import scala.concurrent._

scala> import duration._
import duration._

scala> import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.ExecutionContext.Implicits.global

scala> object X { val y = Future { 9 } ; val z = Future { 7 } ; val r = Await.result(for (a <- y; b <- z) yield (a+b),5.seconds) }
defined object X

scala> X.r
java.lang.NoClassDefFoundError: Could not initialize class $line15.$read$$iw$$iw$$iw$$iw$$iw$$iw$X$
    at $line15.$read$$iw$$iw$$iw$$iw$$iw$$iw$X$$anonfun$3.apply(<console>:14)
    at $line15.$read$$iw$$iw$$iw$$iw$$iw$$iw$X$$anonfun$3.apply(<console>:14)
    at scala.concurrent.Future$$anonfun$flatMap$1.apply(Future.scala:251)
    at scala.concurrent.Future$$anonfun$flatMap$1.apply(Future.scala:249)
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
    at scala.concurrent.impl.ExecutionContextImpl$AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:121)
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
java.util.concurrent.TimeoutException: Futures timed out after [5 seconds]
  at scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:219)
  at scala.concurrent.impl.Promise$DefaultPromise.result(Promise.scala:223)
  at scala.concurrent.Await$$anonfun$result$1.apply(package.scala:111)
  at scala.concurrent.BlockContext$DefaultBlockContext$.blockOn(BlockContext.scala:53)
  at scala.concurrent.Await$.result(package.scala:111)
  ... 34 elided

只是为了表明它的工作原理:

apm@mara:~$goof -Yrepl-class-based
Welcome to Scala version 2.11.0-RC3 (OpenJDK 64-Bit Server VM,5.seconds) }
defined object X

scala> X.r
res0: Int = 16

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读