【发布时间】:2020-04-26 02:19:31
【问题描述】:
我正在试验期货。所以我创建了一个巨大的随机数列表,然后将其分成 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 个数字的列表。问题是它每次都不起作用。有时 andThen 有时不起作用,如果我将 itemsInGroup 值更改为少量,它比大量元素更频繁地工作。所以我怀疑有一种隐式超时或其他我无法解释这种现象的东西。
感谢您的提示
UPD 其实不需要那么多代码,哪怕是简单的例子
val ft = Future {
Thread.sleep(10)
10
}
ft andThen {
case Success(value) => println("Here i work")
}
以同样的方式工作 - 有时工作有时不工作,延迟越多,完成的可能性就越小
【问题讨论】:
-
60% 的时间,它一直有效。 :D
-
开个玩笑,我正在 Scastie 上尝试它,但它似乎没有任何问题。 scastie.scala-lang.org/hlUiDdMlTjyzyNmXj8sgOw
-
我建议明确处理
Failure案例以收集一些反馈,我怀疑您应该从中看到一些东西。 -
在
andThen中传递一个仅处理Success情况的部分函数。如果您为Failure添加案例,您可以提取导致它的异常并检查它。 -
Scala 文档包含如何处理这两种情况的示例:scala-lang.org/api/2.13.1/scala/concurrent/…
标签: scala concurrency future