为什么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). 这种行为的原因是什么? 编辑: EDIT2: 解决方法
只是为了补充堆栈跟踪,当闭包类需要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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |