Scala 未来的onComplete每隔一段时间就会工作一次

Scala 未来的onComplete每隔一段时间就会工作一次,scala,concurrency,future,Scala,Concurrency,Future,我正在试验未来。所以我创建了一个巨大的随机数列表,然后将其分成3组,用一些代码并行运行 val itemsInGroup = 500000 val numbers: List[Int] = 1.to(1500000).map(v => Random.nextInt(20)).toList val groups: List[List[Int]] = numbers.grouped(itemsInGroup).toList.take(3) val future = Future.sequen

我正在试验未来。所以我创建了一个巨大的随机数列表,然后将其分成3组,用一些代码并行运行

val itemsInGroup = 500000
val numbers: List[Int] = 1.to(1500000).map(v => Random.nextInt(20)).toList
val groups: List[List[Int]] = numbers.grouped(itemsInGroup).toList.take(3)

val future = Future.sequence(groups.map(gr => Future[Int] {countSum(gr)}))
future andThen {
  case Success(threeNumbers) => println(threeNumbers)
}
什么使countSum不是太重要,只是为了花时间我使用这个代码

case class Person(name: String, age: Int) {
  def age10: Int = age - age % 10
}

def countSum(lst: List[Int]): Int = lst.map(v => Person("John", v).age10).sum
作为未来的结果,我打印了3个数字的列表。问题是它并不是每次都有效。有时有效有时无效,如果我将itemsInGroup值更改为小量,它的工作频率将高于大量元素。所以我怀疑有一种隐含的超时或者其他我无法解释的现象

请,谢谢你的提示

UPD实际上不需要太多的代码,即使是简单的例子

val ft = Future {
  Thread.sleep(10)
  10
}

ft andThen {
  case Success(value) => println("Here i work")
}

工作原理相同-有时工作有时不工作,延迟越长,完成的可能性就越小

您的主应用程序线程可能在将来完成之前终止。请尝试以下代码

import scala.concurrent.{Await, Future}
import scala.concurrent.duration.Duration
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.{Success, Failure}

val future = Future {
  Thread.sleep(10)
  10
}

val result = future andThen {
  case Success(value) => println("Here i work")
  case Failure(ex) => println(s"Error: ${ex.getMessage}")
}

println(Await.result(result, Duration.Inf)) // Only if you are sure it will ever finish, still it is recommended to use an appropriate timeout.

60%的时间里,它一直在工作撇开DJokes不谈,我正在Scastie上试用,但它似乎没有任何问题。我建议明确处理
失败
案例以收集一些反馈,我怀疑您应该从中看到一些东西。在
中,然后
传递一个只处理
成功
案例的部分函数。如果你为
失败添加一个案例,你可以提取导致它的异常并对其进行检查。Scala文档包含了一个如何处理这两种情况的示例:这样主线程就不会等到所有的未来都完成了吗?@LuisMiguelMejíaSuárez,thanx,我想你的评论是answer@LuisMiguelMej阿斯瓦雷斯,这不是一个IMHO的问题,只是逻辑上的问题——如果我们需要在我们从未来得到结果的一刻正确地完成线程——那么等待将是更合理的方式,不是吗?为什么我们要猜测完成未来需要多少时间呢?在这种情况下,您只是在测试,您可以用wait阻塞主线程以获得结果。这篇文章有类似的问题和答案。