封装在Akka Future中的代码也会阻塞Future支持的线程,那么在这种情况下未来将如何有用

时间:2014-10-24 20:46:28

标签: scala akka future

Akka / Scala Future背后的理念是,当我们发现阻塞的代码片段(如IO调用,网络调用等)时,我们必须将其包装在未来并在某个时间点之后异步获取结果。但是,之前阻塞主线程的阻塞代码现在在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

}

我们如何通过使用未来获益。

2 个答案:

答案 0 :(得分:4)

如果您只有一个执行上下文,并且您只使用执行阻止代码的期货,并且一次只能使用一个,那么使用未来确实没有优势。期货的优点是:

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

答案 1 :(得分:1)

如果代码中有任何阻塞操作,则实际上,将执行该操作的线程将被阻塞。无论产生什么执行上下文。如果您希望流程是纯粹的非阻塞性的,并且要获得使用期货的真正好处,那么您的IO必须是异步的。但是如上所述,期货在其他方面也有帮助。