封装在Akka Future中的代码也会阻塞Future支持的线程,那么Future在这种情况下有什么帮助

pam*_*amu 0 scala future akka

Akka / Scala Future背后的理念是,每当我们找到阻塞的代码段(例如IO调用,网络调用等)时,我们都必须将其包装在一个Future中,并在某个时间点之后异步获取结果。但是,之前阻塞主线程的阻塞代码块现在阻塞了Future支持的单独线程。那Akka / Scala Future买了什么。

val blockingCallResult: Result = block() //blocks the thread of execution.

now let's use Akka/Scala future and wrap the blocking call with Future


val future = Future[Result] {

   val blockingCallResult: Result = block() //also blocks on some thread in thread pool

   blockingCallResult

}
Run Code Online (Sandbox Code Playgroud)

我们如何通过利用未来而受益。

lmm*_*lmm 5

如果只有一个执行上下文,并且仅使用执行阻塞代码的期货,并且一次仅执行一个,那么使用期货确实没有任何优势。期货的优点是:

  • 并行性-在多核计算机上,多个线程可以同时执行。在执行上下文中使用期货避免了为每个操作创建新线程或手动重用线程的开销,执行上下文使您可以控制池的大小。
  • 通过使用不同的执行上下文来分离I / O和计算线程。这允许内核在长期运行的计算任务之前安排对I / O的交互式响应,从而改善了延迟。
  • 真正的异步I / O,例如通过scala-redis-nb(或Netty或ReactiveMongo(?))。而不是Future只是一个阻塞的线程,有可能使用Futures(例如通过Promises)公开异步API(可能会使用回调的那种),然后您可以编写真正的异步代码,避免阻塞任何线程I / O,并且比直接使用基于回调的API更好的API。