首页 > 解决方案 > 未来 onComplete 每隔一段时间工作一次

问题描述

我正在试验期货。所以我创建了一个巨大的随机数列表,然后将它分成 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")
}

以相同的方式工作 - 有时工作有时不工作,延迟越多,完成的可能性就越小

标签: scalaconcurrencyfuture

解决方案


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

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.

推荐阅读