我(一个新手)正在测试我关于 Scala Futures 的概念以及使用它们的正确模式。
前提
Scala 的 future 是异步执行的代码块。因此,主线程创建一个或多个这样的 future,安装 onSuccess() [注意:同样适用于 OnComplete/onFailure] 回调并继续。当 future 完成运行时,回调就会被执行。
据推测,这些回调生成的结果应该由主线程使用。结果存储在 Try[T] 容器中,具有一次写入/多次读取约束。主线程(或任何其他线程,但这不是重点)决定何时在容器中达到峰值并收集结果以供进一步处理。
到目前为止,无论我关注的是哪个讨论/博客/API,都提到了主线程不必等待的事实:它可以继续做自己的事情,允许 future 并行执行并准备好结果。
Question
但我的问题是:在最简单的情况下,当它完成正在做的事情时,主线程将必须等待让回调完成,不是吗?并且,因为没有提供中断机制来表明未来已经发生finished执行时,主线程别无选择,只能“等待”(可能有时间限制)结果准备好?换句话说,在使用 future 的应用程序中,等待最终是不可避免的,不是吗?
Note
我知道我们可以使用组合器或 Promise(也有其他模式)来链接 future,从而完全避免这个问题。但是,我试图澄清我的概念,即在某些情况下,使用期货并不能消除等待它们完成的需要。
这是一个太初级的问题吗?我的理解是否存在很大的空白?
了解两者之间的理论差异将很有用Await
and async
。这些分别称为阻塞和非阻塞。
Blocking
阻塞计算很像while
loop.
while(!done) {
if (isDone) {
// do whatever
done = true
}
}
这是同步阻塞计算。这Thread
在阻止操作完成之前无法执行任何其他操作,因为它会不断检查该操作。
您实际上只有与机器上的处理器一样多的线程。希望您能看到它们如何快速被完全占用,并形成一个巨大的“要做的事情”的 FIFO 队列。
非阻塞
从本质上讲,这个概念非常简单。检查不是连续检查某件事是否完成,而是按照给定的时间间隔进行。这Future
每 100 毫秒检查一次是否完成(比方说)。
最棒的是,在每 100 毫秒的中断期间,线程都可以自由地执行其他操作。这就是为什么您可以获得卓越的性能async
things.
底线
处理器在给定的时间间隔内完成更多的事情在物理上是可能的。这是一个非常简单的三段论。
假设您和您的朋友安排下午 3 点见面喝咖啡。他没有出现。
你可以坐在咖啡店里无情地咒骂,也可以回家烤饼干。当饼干烘烤时,你每 5 分钟查看一次手机,直到他最终发短信,然后你们见面。
在场景1中,你很生气并且一整天都没有做太多事情。
在场景 2 中,您对自己的烹饪成功感到高兴,并很高兴见到朋友。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)