我有一些处理队列的Spark代码;获取队列的第一个元素,使用scala Futures构造进行处理,并在完成Future时获取下一个元素。代码看起来(简化)如下:
import scala.concurrent.ExecutionContext.Implicits.global
def nextExperiment() {
Future { ... }.onComplete(x => nextExperiment())
}
在集群上运行此代码(非本地)时,它只会开始处理队列的第一个元素,然后在完成队列中的所有元素之前快速关闭上下文。但是,如果我删除了Future{ }
结构,它完全符合预期。
为什么会这样?
答案 0 :(得分:2)
好吧,你不能显示你打电话给nextExperiment
的地方。但鉴于你所看到的,该程序可能只是从这个调用返回,继续到程序的结束,并完成。如果你想在节目本身完成you need to block until all is done之前等待所有期货完成。