Akka
文档说:
您可能很想将阻塞调用包装在 Future 中并使用它来代替,但这种策略太简单了:当应用程序在负载增加的情况下运行时,您很可能会发现瓶颈或内存或线程不足。
他们提出以下策略:
在 a 中执行阻塞调用
Future
,确保在任何时间点此类调用的数量都有上限(提交无限数量的这种性质的任务将耗尽您的内存或线程限制)。在 a 中执行阻塞调用
Future
,为线程池提供一个线程数上限,该上限适用于运行应用程序的硬件。
你知道这些策略的任何实施吗?
Akka
文档说:
您可能很想将阻塞调用包装在 Future 中并使用它来代替,但这种策略太简单了:当应用程序在负载增加的情况下运行时,您很可能会发现瓶颈或内存或线程不足。
他们提出以下策略:
在 a 中执行阻塞调用Future
,确保在任何时间点此类调用的数量都有上限(提交无限数量的这种性质的任务将耗尽您的内存或线程限制)。
在 a 中执行阻塞调用Future
,为线程池提供一个线程数上限,该上限适用于运行应用程序的硬件。
你知道这些策略的任何实施吗?
期货在执行上下文中运行。从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")
}
}
Akka 自己实现了这一切,您可以将阻塞调用包装到 Actors 中,然后使用调度程序来控制执行线程池。