当前位置: 首页 > 知识库问答 >
问题:

Scala futures:当futures执行时,主线程应该做什么?

缪升
2023-03-14

我(新手)正在测试我对Scala期货的概念以及使用它们的正确模式。

前提
Scala的期货是要异步执行的代码块。因此,主线程创建一个或多个这样的期货,安装on成功()[注意:同样适用于On完成/onFailure]回调和收益。回调在期货完成运行时执行。

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

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

问题

但我的问题是:在最简单的情况下,当它完成了它正在做的任何事情时,主线程将不得不等待回调完成,不是吗?而且,由于没有提供中断机制来指示未来的执行已经完成,主线程除了“等待”(可能有时间限制)结果准备就绪之外别无选择?换句话说,在使用期货的应用程序中,等待最终是不可避免的,不是吗?

注意< br >我知道我们可以使用组合子或promise(还有其他模式)来链接未来,以完全避免这个问题。但是,我试图澄清我的概念,在某些情况下,使用期货并不排除等待他们结束的需要。

是不是太初级的问题?是不是在我的理解上表现出了很大的空白?

共有1个答案

郎琪
2023-03-14

理解< code>Await和< code>async之间的理论差异将会很有用。这些分别被称为阻塞和非阻塞。

阻塞

阻塞计算很像< code>while循环。

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

这是同步阻塞计算。线程在阻塞操作完成之前不能执行任何其他操作,因为它会不断检查该操作。

您实际上只拥有与机器上的处理器一样多的线程。希望你能看到它们是如何被迅速填满的,一个巨大的“要做的事情”FIFO队列就这样形成了。

非阻塞

从本质上讲,这个概念非常简单。检查不是持续检查是否完成了某项工作,而是在给定的时间间隔内完成。未来的将每100毫秒检查一次是否完成。

令人惊叹的是,在这100毫秒的每一次中断中,线程都可以自由地做其他事情。这就是您从< code >异步事物中获得卓越性能的原因。

底线

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

假设你和你的朋友安排下午3点见面喝咖啡。他没有出现。

你可以坐在咖啡馆里没完没了地咒骂,也可以回家烤饼干。饼干烤着的时候,你每5分钟检查一次手机,直到他最终发短信,然后你见面。

场景一,你很生气,一整天都没做多少事。

在场景2中,你对自己的烹饪成功感到高兴,并且心情很好,可以看到一个朋友。

 类似资料:
  • 我正在尝试创建一个消费者-生产者程序,其中消费者线程生产者的数字填充数组,消费者线程打印填充数组的数字。目前,我可以填充数组并在使用者/生产者线程之间来回传递数据,但我希望生产者创建数字的速度比使用者处理数字的速度快。 此刻,每1秒产生一个数字,每3消耗一个数字。在消耗一个之前应该产生两个数字,但是我的生产者线程正在等待,直到它产生的数字被消耗。 我试过移动互斥锁和解锁,还有信号,但我没有得到它的

  • 问题内容: 我刚刚遇到了这个“错误”,但是我不确定这是否是故意的:代码: 在第一个示例中,它是在swing线程上执行的,但在第二个示例中,它不是,尽管我认为应该这样做。 这是错误还是故意的? 问题答案: 在我看来,这似乎是您的误解 第一行就像在说:“好吧,秋千,我想要你做的是”。所以Swing执行它 第二行就像是说:“确定,Swing,我要您执行的是方法返回的对象的方法”。一个是方法, 我现在执行

  • 我如何启动两个线程,其中thread1首先执行,thread2在thread1结束时启动,而主方法线程可以在不锁定其他两个线程的情况下继续工作? 我尝试了join(),但是它需要从线程调用,线程必须等待另一个线程,没有办法执行类似thread2.join(thread1)的操作;因此,如果我在main()中调用join,我将有效地停止主线程的执行,而不仅仅是Thread2的执行。 #编辑:为什么我

  • 我确信这两个列表都不是空的,并且正在调用,但是没有调用order execution run方法....

  • 我们有一个服务方法GetDataParallel(),目前可能被许多客户机调用,我们使用ExecutorService在其中调用MyCallable。但是我找到了除非我打电话给执行者服务。关机();应用程序永远不会退出,所以为什么应用程序不能退出,我们必须在应用程序退出之前手动关闭所有线程池线程?在服务环境中,我认为我们不需要呼叫执行器服务。关机();让应用程序继续运行,对吗?

  • 来自文档:http://docs.python.org/2/library/thread 让我们在这里只讨论非守护进程线程。因为第一个引号没有特别提到非守护进程线程,所以我假设,如果主线程退出,即使是非守护进程线程也应该被杀死。然而,第二句引文却表明了另一种情况。事实上,当主线程退出时,非守护进程线程确实不会被杀死。那么,这里的第一个引用有什么意义呢?