gpt4 book ai didi

斯卡拉 future : what is the main thread expected to do while futures are executing?

转载 作者:行者123 更新时间:2023-12-04 17:53:22 26 4
gpt4 key购买 nike

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

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

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

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

问题

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

备注
我知道我们可以使用组合子或 Promise(还有其他模式)链接 future ,以完全避免这个问题。但是,我试图澄清我的概念,即在某些情况下,使用 future 并不能消除等待它们完成的需要。

这是一个太初级的问题吗?它是否在我的理解中显示出很大的空白?

最佳答案

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

阻止

阻塞计算很像 while环形。

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

这是同步阻塞计算。 Thread在阻塞 Action 完成之前不能做任何其他事情,因为它会不断检查 Action 。

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

非阻塞

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

令人敬畏的是,在每一个 100 毫秒的休息时间里,线程都可以自由地做其他事情。这就是您从 async 获得卓越性能的原因事物。

底线

处理器在给定的时间间隔内可以做更多的事情。这是一个非常简单的三段论。

假设您和您的 friend 安排在下午 3 点见面喝咖啡。他没有出现。

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

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

在情景 2 中,您对自己的 cooking 成功感到高兴,并且很高兴见到 friend 。

关于斯卡拉 future : what is the main thread expected to do while futures are executing?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21558858/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com