我(新手)正在测试我关于Scala期货的概念以及使用它们的正确模式。
前提
Scala的未来是异步执行的代码块。因此,主线程创建一个或多个这样的期货,安装onSuccess()[注意:同样适用于OnComplete / onFailure]回调并继续。回调在期货完成运行时执行。
据推测,这些回调会生成应该由主线程使用的结果。结果存储在Try [T]容器中,具有一次写入/多次读取约束。主要(或任何其他线程,但不是点)决定何时在容器中达到峰值并收集结果以供进一步处理。
到目前为止我所关注的讨论/博客/ API,提到主线程不必等待的事实:它可以继续做自己的事情,允许期货并行执行,并且准备好结果。
问题
但我的问题是:在最简单的情况下,它已经完成了它正在做的任何事情,主线程必须等待才能完成回调,不是吗?并且,因为没有提供可以指示未来已经完成执行的中断机制,所以主线程没有选择,只能“等待”(可能有时间限制)结果为准备?换句话说,在使用期货的应用程序中,等待最终是不可避免的,不是吗?
注意
我知道我们可以使用组合器或Promise(以及其他模式)链接未来,以完全避免这个问题。但是,我试图澄清我的观点,即在某些情况下,使用期货并不能避免等待它们完成的需要。
问题太基本了吗?它在我的理解中显示出一个很大的空白吗?
答案 0 :(得分:3)
了解Await
和async
之间的理论差异会很有用。这些分别称为阻塞和非阻塞。
<强>禁止强>
阻塞计算很像while
循环。
while(!done) {
if (isDone) {
// do whatever
done = true
}
}
这是同步阻塞计算。在阻止操作完成之前,Thread
无法执行任何其他操作,因为它会不断检查操作。
你真的只有机器上的处理器一样多的线程。希望你能看到它们如何能够迅速被完全占用,并形成了一个巨大的“待办事项”FIFO队列。
<强>非阻塞强>
从本质上讲,这个概念非常简单。不是连续检查是否已完成某些操作,而是以给定的时间间隔进行检查。每隔100毫秒检查一次Future
(比方说)。
令人敬畏的是,在每100分钟休息期间,线程可以自由地做其他事情。这就是为什么你从async
事物中获得优异的性能。
底线
处理器在物理上可以在给定的时间间隔内执行更多操作。这是一个非常简单的三段论。
说你和你的朋友安排在下午3点见面喝咖啡。他没有露面。
你可以坐在咖啡馆里无情地咒骂,也可以回家烤饼干。当饼干烘烤时,你每5分钟检查一次手机,直到他最终发短信然后你见面。
在情景1中,你很生气,整天都没有做太多。
在情景2中,您很高兴看到您的烹饪成功,并很高兴见到朋友。