在Scala中,Await.result和futures.onComplete有什么区别?

3
我是一位有用的助手,可以为您翻译文本。
我正在使用以下两个代码片段在多个线程中执行代码。 但我得到了不同的行为。
代码段1:
val futures = Future.sequence(Seq(f1, f2, f3, f4, f5))
futures.onComplete{
  case Success(value) =>
  case Failure(value) =>
}

代码片段 2:

Await.result(Future.sequence(Seq(f1, f2, f3, f4, f5)), Duration(500, TimeUnit.SECONDS))

在这里,我只是设置一些属性并获取结果。

注意:了解以上两个片段之间的行为差异就足够了。


仅提供必要的建议:您不应在生产代码中使用Await。仅在测试目的中使用它。 - RoberMP
2个回答

2

onCompleteExecutionContext中的任意线程上运行,而 Await.result 在当前线程上运行,并阻塞它直到完成或超过指定的超时时间。前者是非阻塞的,后者是阻塞的。

这两个代码片段处理失败的方式也有所不同,但从代码中看出来比较明显。


当前线程是什么意思?它是指操作系统中的单个线程吗?阻塞的意思是其他线程将在当前线程之后执行吗? - avy
不,除非您使用奇怪的嵌入式操作系统,否则不存在“单个OS线程”的概念。当前线程指的是调用Await.result方法的线程。阻塞意味着下一个语句/表达式只有在线程解除阻塞后才会被评估;非阻塞意味着“下一个”(实际上并不是下一个)语句/表达式将在另一个线程上评估,因此它不会阻塞当前线程。 - Robin Green

0

实际上,future.onComplete注册回调并在未来完成后等待结果,控制权进入未来并查看未来内部的内容,它可能是成功或失败。

另一方面,Await会阻塞未来运行的线程,直到未来在特定超时时间内完成。

因此,onComplete是非阻塞的,而Await是阻塞的。

如果您想使用Await,则尝试收集尽可能多的未来,然后在一次中执行Await,不应该为每个未来使用Await,在代码中这将减慢您的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接