阻止Scala调用的期货

时间:2013-04-11 14:09:43

标签: scala concurrency future

Akka文档说:

您可能想要将阻塞调用封装在Future中并使用它,但是这个策略太简单了:当应用程序在增加的负载下运行时,您很可能会发现瓶颈或内存或线程耗尽。

他们提出以下策略:

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

  • Future内执行阻塞调用,提供一个线程池,其中包含适用于运行应用程序的硬件的线程数上限。

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

2 个答案:

答案 0 :(得分:16)

期货在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")
  }

}

答案 1 :(得分:2)

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