Scala future:future 执行时主线程预计会做什么?

2024-02-10

我(一个新手)正在测试我关于 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(使用前将#替换为@)

Scala future:future 执行时主线程预计会做什么? 的相关文章

随机推荐

  • 找到坐标 x 和 y 列表的优化位置

    我是编程新手 尤其是Python新手 但我正在努力学习它 到目前为止我发现它非常令人着迷 我有一个包含 30 个固定坐标 x 和 y 的列表 x np array 13 10 12 13 11 12 11 13 12 13 14 15 15
  • UIButton 状态已选择

    我看过很多有关更改所选按钮图像的信息 但作为新人 我在实现更简单的版本时遇到了一些麻烦 当按下按钮时 它会变暗 我希望它在被选择后保持这种状态 所以有几个问题 我是否为按钮创建 IBOutlet 然后使用 IBAction 来更改状态 例如
  • 从 pandas dropna 中排除特定列

    我有一个数据框 我想删除除特定列之外的所有列中的值 NA 在本例中为 V1 df V1 V2 V3 V4 A 10 20 NA B NA NA NA C 5 20 3 D 15 20 4 E NA 10 5 output V1 V2 V3
  • Node dotenv 不适用于 pm2

    我有一个应用程序 其中本地 没有 pm2 所有环境变量 env使用文件工作得很好dotenv 但在我使用的服务器上pm2要运行应用程序 环境变量仍然存在undefined 我用来在服务器上运行应用程序的 pm2 命令是 pm2 start
  • 无法激活机架(〜> 1.4.0,运行时)已激活机架1.5.0

    我已经寻找这个问题的答案一天多了 并彻底搜索了 StackOverflow 我了解正在发生的冲突 我应该卸载不需要的 Rack 版本 但事情是这样的 我正在Koding上开发 http koding com http koding com
  • 对于日期序列化:从 JAXB2 到 jackson-dataformat-xml 的 @XmlJavaTypeAdapter 的等效注释是什么?

    我有一个 Spring Web 应用程序4 3 6版本 在某种程度上 它可以与 XML 和 JSON 一起使用 对于 Json 我使用 Jackson 对于 XML 我曾经使用过JAXB2 但不再是因为它不支持通用集合 通用集合表示如下 p
  • 是否有“max”函数和分组的替代(聚合操作的性能优化)?

    我有一个很大的查询 它也返回很大的响应 查询如下所示 SELECT group subgroup max last update FROM SELECT a as group a1 as subgroup d1 as last update
  • 如何在覆盖它的网页上恢复console.log?

    Twitter 的网站做了类似的事情 console log function 将浏览器的内置console log方法进入无操作状态 有办法恢复原来的功能吗 除非他们也在原型中删除了它 否则得到log方法使用getPrototypeOf
  • TFS-SDK:合并不起作用

    作为更大实现的一部分 我尝试使用 TFS SDK 实现源代码控制分支 文件夹的合并操作 我正在针对 TFS2010 安装进行工作 我所拥有的是这样的 using System using Microsoft TeamFoundation C
  • 信息窗口不是中心位置 Android Google 地图 v2

    我在 Google 地图 v2 上的信息窗口上遇到问题 信息窗口位于标记左侧 此问题仅在 Samsung Galaxy S4 上重现 我安装了Google Api Demo 重现了 这是错误吗 如何修复它 我已在地图 v2 跟踪器上提交了此
  • dplyr 和多重线性模型

    我正在尝试使用运行大量回归dplyr对于个人 ID cusip 和年份 fyear 但我不知道如何利用summary功能 我需要运行模型 获取系数 将它们加在一起 然后mutate结果到另一个变量beta 这是一些代码 虽然不起作用 但可以
  • XDocument 文本节点换行

    我正在尝试使用以下命令将换行符插入文本节点XText来自 Linq XML 命名空间 我有一个包含换行符的字符串 但是我需要弄清楚如何将它们转换为实体字符 即 10 而不是仅仅让它们作为新行出现在 XML 中 XElement elemen
  • 如何在 C# 中获取给定服务的子进程列表?

    我有一个创建许多子进程的服务 使用 c 我需要确定当前正在运行的这些子进程的数量 例如 我有一个名为 TheService 的服务正在运行 这会产生 5 个子进程 全部称为 process exe 是否可以确定服务下运行的子进程的数量 本质
  • Javascript正则表达式:如何将变量放入正则表达式中? [复制]

    这个问题在这里已经有答案了 例如 function input var testVar input string string replace ReGeX testVar ReGeX replacement 但这当然行不通 有什么办法可以做
  • 使用 SHOW_AS_ACTION_WITH_TEXT 时,项目标题未以纵向显示

    在我的活动中 我有一个带有单个项目的操作模式 该项目具有标题和图标 我希望同时显示标题和图标 因此我使用 SHOW AS ACTION WITH TEXT 和 SHOW AS ACTION ALWAYS 标志 横向的话 没问题 我有标题 图
  • 使用 Log4J 记录 Spring bean 初始化

    当我运行我的应用程序时 它会在 bean 初始化时停止 但不显示任何日志条目 所以我不知道发生了什么 Log4j properties log4j rootLogger DEBUG stdout R log4j appender stdou
  • 使用 mongoDB 中的新键更新对象数组

    与此类似question https stackoverflow com questions 9209670 mongo push to array inside array 翻阅数据集 我有类似的东西 user id 1231mjnD 3
  • XCode/PhoneGap - Apple Mach-O 链接器错误

    我刚刚完成了我的应用程序的编程 我尝试过了归档应用程序以供提交 但是没有成功 显示以下错误 仅当我想要存档应用程序时才会出现此问题 在测试设备或模拟器上运行完美 没有错误 Ld Users Admin Library Developer X
  • -configuration.output.path:提供的值“public”不是绝对路径!使用网络包

    我正在使用 Laravel Mix 它基于 WebPack 我让它工作了 现在它失败了 Invalid configuration object Webpack has been initialised using a configurat
  • Scala future:future 执行时主线程预计会做什么?

    我 一个新手 正在测试我关于 Scala Futures 的概念以及使用它们的正确模式 前提Scala 的 future 是异步执行的代码块 因此 主线程创建一个或多个这样的 future 安装 onSuccess 注意 同样适用于 OnC