Scala期货:期货执行期间预计会做什么主线?

时间:2014-02-04 17:07:00

标签: scala promise future

我(新手)正在测试我关于Scala期货的概念以及使用它们的正确模式。

前提
Scala的未来是异步执行的代码块。因此,主线程创建一个或多个这样的期货,安装onSuccess()[注意:同样适用于OnComplete / onFailure]回调并继续。回调在期货完成运行时执行。

据推测,这些回调会生成应该由主线程使用的结果。结果存储在Try [T]容器中,具有一次写入/多次读取约束。主要(或任何其他线程,但不是点)决定何时在容器中达到峰值并收集结果以供进一步处理。

到目前为止我所关注的讨论/博客/ API,提到主线程不必等待的事实:它可以继续做自己的事情,允许期货并行执行,并且准备好结果。

问题

但我的问题是:在最简单的情况下,它已经完成了它正在做的任何事情,主线程必须等待才能完成回调,不是吗?并且,因为没有提供可以指示未来已经完成执行的中断机制,所以主线程没有选择,只能“等待”(可能有时间限制)结果为准备?换句话说,在使用期货的应用程序中,等待最终是不可避免的,不是吗?

注意
我知道我们可以使用组合器或Promise(以及其他模式)链接未来,以完全避免这个问题。但是,我试图澄清我的观点,即在某些情况下,使用期货并不能避免等待它们完成的需要。

问题太基本了吗?它在我的理解中显示出一个很大的空白吗?

1 个答案:

答案 0 :(得分:3)

了解Awaitasync之间的理论差异会很有用。这些分别称为阻塞和非阻塞。

<强>禁止

阻塞计算很像while循环。

while(!done) {
  if (isDone) {
    // do whatever
    done = true
  }
}

这是同步阻塞计算。在阻止操作完成之前,Thread无法执行任何其他操作,因为它会不断检查操作。

你真的只有机器上的处理器一样多的线程。希望你能看到它们如何能够迅速被完全占用,并形成了一个巨大的“待办事项”FIFO队列。

<强>非阻塞

从本质上讲,这个概念非常简单。不是连续检查是否已完成某些操作,而是以给定的时间间隔进行检查。每隔100毫秒检查一次Future(比方说)。

令人敬畏的是,在每100分钟休息期间,线程可以自由地做其他事情。这就是为什么你从async事物中获得优异的性能。

底线

处理器在物理上可以在给定的时间间隔内执行更多操作。这是一个非常简单的三段论。

说你和你的朋友安排在下午3点见面喝咖啡。他没有露面。

你可以坐在咖啡馆里无情地咒骂,也可以回家烤饼干。当饼干烘烤时,你每5分钟检查一次手机,直到他最终发短信然后你见面。

在情景1中,你很生气,整天都没有做太多。

在情景2中,您很高兴看到您的烹饪成功,并很高兴见到朋友。