【问题标题】:Future onComplete works every other time [duplicate]未来的 onComplete 每隔一段时间就会工作一次[重复]
【发布时间】: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


【解决方案1】:

您的主应用线程可能在您的未来完成之前被终止。试试下面的代码。

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.

【讨论】:

  • 所以主线程不等到所有的期货都完成了吗?
  • @LuisMiguelMejíaSuárez,thanx,我想你的评论就是答案
  • @LuisMiguelMejíaSuárez,这不是恕我直言的问题,只是逻辑 - 如果我们需要在从 Future 获得结果的那一刻完成线程 - 那么 Await 将是更合理的方式,不是吗?为什么我们要猜测完成 Future 需要多少时间?
  • 这种情况下,你只是在测试的地方,你可以用Await阻塞主线程来得到结果。
  • 这篇文章有类似的问题和答案。 stackoverflow.com/questions/28078033/…
猜你喜欢
  • 1970-01-01
  • 2015-10-13
  • 2020-10-03
  • 2021-08-16
  • 2010-10-23
  • 2015-11-14
  • 2010-10-05
  • 2012-03-02
  • 2023-04-03
相关资源
最近更新 更多