实际使用期货?即,如何杀死他们?

DrG*_*ary 6 scala

期货非常方便,但在实践中,您可能需要对其执行提供一些保证.例如,考虑:

import scala.actors.Futures._

def slowFn(time:Int) = {
    Thread.sleep(time * 1000)
    println("%d second fn done".format(time))
}

val fs = List( future(slowFn(2)), future(slowFn(10)) )
awaitAll(5000, fs:_*)
println("5 second expiration. Continuing.")

Thread.sleep(12000)      // ie more calculations
println("done with everything")
Run Code Online (Sandbox Code Playgroud)

我们的想法是并行启动一些慢速运行的功能.但是如果期货执行的函数没有返回,我们就不想永远挂起.所以我们使用awaitAll()来对期货进行超时.但是如果您运行代码,您会看到5秒计时器到期,但10秒未来继续运行并稍后返回.超时不会杀死未来; 它只是限制了连接等待.

那么你如何在超时后杀死未来?似乎期货不能在实践中使用,除非您确定它们将在已知的时间内返回.否则,您将冒险将线程池中的线程丢失到非终止期货,直到没有剩余.

所以问题是:你如何杀死未来?鉴于这些风险,期货的预期使用模式是什么?

Dan*_*ral 2

期货旨在用于无论如何都需要等待计算完成的设置。这就是为什么它们被描述为用于运行缓慢的函数。您想要该函数的结果,但同时您可以做其他事情。事实上,您可能有许多彼此独立的 future,您可能希望并行运行,同时等待所有的完成。

计时器只是提供等待以获得部分结果的机会。