【问题标题】:Practical use of futures? Ie, how to kill them?期货的实际用途?即,如何杀死他们?
【发布时间】:2010-11-17 18:31:27
【问题描述】:

Future 非常方便,但在实践中,您可能需要对其执行进行一些保证。例如,考虑:

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 秒未来继续运行并稍后返回。超时不会杀死未来;它只是限制了加入等待。

那么你如何在超时后杀死一个未来?除非您确定它们会在已知的时间内返回,否则似乎无法在实践中使用期货。否则,您将冒着将线程池中的线程丢失到非终止future 的风险,直到没有线程为止。

所以问题是:你如何杀死期货?考虑到这些风险,期货的预期使用模式是什么?

【问题讨论】:

    标签: scala


    【解决方案1】:

    Future 旨在用于无论如何都需要等待计算完成的设置。这就是为什么它们被描述为用于运行缓慢的函数。你想要那个函数的结果,但同时你还有其他事情可以做。事实上,您可能有许多相互独立的未来,您可能希望并行运行,同时等待全部完成。

    计时器只是提供一个等待以获得部分结果。

    【讨论】:

    • 但是由于停止问题还没有解决:),你不能保证一个函数会返回。因此,期货可能永远不会回来。所以最初的问题仍然存在......关于用于提取部分结果的 awaitAll() 的观点。这听起来像是一种使用模式:传入一个在生成部分结果时保存部分结果的类,然后使用计时器将它们取出。
    【解决方案2】:

    我认为 Future 不能简单地被“杀死”的原因与 java.lang.Thread.stop() 是 deprecated 的原因完全相同。

    在 Future 运行时,需要一个线程。为了在不调用执行线程的 stop() 的情况下停止 Future,需要特定于应用程序的逻辑:定期检查特定于应用程序的标志或执行线程的中断状态是一种方法。

    【讨论】:

      猜你喜欢
      • 2018-11-25
      • 2020-04-26
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 2011-06-16
      相关资源
      最近更新 更多