期货非常便利,但在实践中,您可能需要一些担保执行。例如,考虑:实际使用期货?也就是说,如何杀死他们?
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")
这个想法是启动一些缓慢运行的并行功能。但是,如果期货执行的功能不返回,我们不会永远挂起。所以我们使用awaitAll()来暂停期货。但是,如果您运行代码,您会看到5秒计时器到期,但10秒钟后继续运行并稍后返回。超时不会杀死未来;它只是限制连接等待。
那么在超时时间过后,你如何杀死未来?除非你确定他们会在已知的时间内返回,否则期货似乎不能用于实践。否则,您将面临线程池中的线程无法终止期货的风险,直到没有剩余线程为止。
所以问题是:你如何杀死未来?鉴于这些风险,期货的预期使用模式是什么?
但由于暂停问题还没有解决:),你不能保证函数将返回。因此,期货可能永远不会回报。所以原来的问题仍然存在...... 关于awaitAll()被用来拉取部分结果的观点。所以这听起来像一个使用模式:传入一个类,在生成时保存部分结果,然后使用计时器将其拉出。 – DrGary 2009-08-07 20:09:17