【问题标题】:Futures for blocking calls in ScalaScala 中阻塞调用的期货
【发布时间】:2013-04-03 18:41:38
【问题描述】:

Akka 文档说:

您可能很想将阻塞调用包装在 Future 中并使用它来代替,但是这种策略太简单了:当应用程序在负载增加的情况下运行时,您很可能会发现瓶颈或内存或线程不足。

他们提出了以下策略:

  • Future 内执行阻塞调用,确保在任何时间点此类调用的数量都有上限(提交无限数量的此类任务将耗尽您的内存或线程限制)。

  • Future 内执行阻塞调用,为线程池提供适用于运行应用程序的硬件的线程数上限。

您知道这些策略的实施吗?

【问题讨论】:

    标签: scala concurrency future


    【解决方案1】:

    期货在execution contexts 内运行。这在Future API 中很明显:任何涉及将一些回调附加到未来或从任意计算或另一个未来构建未来的调用都需要一个隐式可用的ExecutionContext 对象。因此,您可以通过调整它们运行的​​ ExecutionContext 来控制未来的并发设置。

    例如,要实施第二个策略,您可以执行类似的操作

    import scala.concurrent.ExecutionContext
    import java.util.concurrent.Executors
    import scala.concurrent.future
    
    object Main extends App {
    
      val ThreadCount = 10
      implicit val executionContext = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(ThreadCount))
    
      val f = future {
        println(s"Hello ! I'm running in an execution context with $ThreadCount threads")
      }
    
    }
    

    【讨论】:

    【解决方案2】:

    Akka 本身实现了这一切,您可以将阻塞调用包装到 Actors 中,然后使用dispatchers 来控制执行线程池。

    【讨论】:

    • 此外,请避免使用 ActorSystem 的默认调度程序来执行包含阻塞调用的 Futures,因为这样做会给 Actor 实例造成瓶颈。最好分配一个单独的 ExecutionContext 专门用于执行这些阻塞代码。
    猜你喜欢
    • 2016-09-29
    • 1970-01-01
    • 2016-06-02
    • 2019-02-23
    • 2016-12-18
    • 2015-04-05
    • 2015-11-08
    • 1970-01-01
    • 2014-01-22
    相关资源
    最近更新 更多