首页 文章

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

提问于
浏览
0

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

}

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

1 回答

  • 4

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

    • Parallelism - 在多核机器上,几个线程可以同时执行 . 将future与执行上下文一起使用可以避免为每个操作创建新线程或手动重用线程的开销,并且执行上下文使您可以控制池大小 .

    • 通过使用不同的执行上下文分离I / O和计算线程 . 这允许内核在长时间运行的计算任务之前安排对I / O的交互式响应,从而改善延迟 .

    • 真正的异步I / O,通过例如scala-redis-nb(或Netty或ReactiveMongo(?)) . 而不是未来的只是作为一个线程块,它可能暴露利用期货(例如,通过承诺)异步API(否则可能使用回调的那种),然后你可以编写真正的异步代码,避免了任何线程阻塞I / O,使用比直接使用基于回调的API更好的API .

相关问题