首页 文章

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

提问于
浏览
3

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

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

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

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

Question

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

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

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

1 回答

  • 3

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

    Blocking

    阻塞计算很像 while 循环 .

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

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

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

    Non-blocking

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

    令人敬畏的是,在100ms的每一次休息期间,线程都可以自由地做其他事情 . 这就是为什么你从 async 事物中获得卓越的性能 .

    Bottom line

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

    假设您和您的朋友安排在下午3点见面喝咖啡 . 他没有露面 .

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

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

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

相关问题