scala - 未来 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")
}
以相同的方式工作 - 有时工作有时不工作,延迟越多,完成的可能性就越小
解决方案
您的主应用程序线程可能在您的未来完成之前被终止。试试下面的代码。
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.
推荐阅读
- google-chrome - 错误(失败)net::ERR_HTTP2_PROTOCOL_ERROR 仅在 Chrome 中随机发生
- python - 如何将场景添加到先前定义的 QGraphicsView
- selenium - Selenium 操作 - jsonKeyboard 和 jsonMouse = null
- javascript - jsconfig 和 jest 不交互以使用相同的根路径
- android - ContextThemeWrapper 不能在 AppCompatActivity 中强制转换
- java - 从 IntelliJ 运行并使用 setcap 授予网络嗅探权限时,Java 每隔几秒输出一次全线程转储
- c# - 实体框架 - 获取记录:逗号分隔的字符串(或列表
) 包含在实体集合中 - mongodb - MONGO mongodb 脚本替换数组元素中的子字符串
- c# - 在 WebBrowser 控件中忽略空字符后的 div innerHtml 字符串,但在 IE8 中没有
- angular - 单元测试角案例开关formControl