Scala的Future线程池有多大?
我的Scala应用程序创建了许多数百万个future {}
,我想知道是否有什么可以优化它们的方法,例如配置线程池。
谢谢。
Scala的Future线程池有多大?
我的Scala应用程序创建了许多数百万个future {}
,我想知道是否有什么可以优化它们的方法,例如配置线程池。
谢谢。
这个答案来自于monkjack,是采纳答案下的评论。然而,有些人可能会错过这个很棒的答案,所以我在这里重新发布。
implicit val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))
如果您只需要更改线程池数量,只需使用全局执行器并传递以下系统属性。
-Dscala.concurrent.context.numThreads=8 -Dscala.concurrent.context.maxThreads=8
您可以指定自己的ExecutionContext,以便运行在其中的future,而不是导入全局隐式ExecutionContext。
import java.util.concurrent.Executors
import scala.concurrent._
implicit val ec = new ExecutionContext {
val threadPool = Executors.newFixedThreadPool(1000)
def execute(runnable: Runnable) {
threadPool.submit(runnable)
}
def reportFailure(t: Throwable) {}
}
在Scala Futures中指定线程池的最佳方法:
implicit val ec = new ExecutionContext {
val threadPool = Executors.newFixedThreadPool(conf.getInt("5"));
override def reportFailure(cause: Throwable): Unit = {};
override def execute(runnable: Runnable): Unit = threadPool.submit(runnable);
def shutdown() = threadPool.shutdown();
}
class ThreadPoolExecutionContext(val executionContext: ExecutionContext)
object ThreadPoolExecutionContext {
val executionContextProvider: ThreadPoolExecutionContext = {
try {
val executionContextExecutor: ExecutionContextExecutor = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(25))
new ThreadPoolExecutionContext(executionContextExecutor)
} catch {
case exception: Exception => {
Log.error("Failed to create thread pool", exception)
throw exception
}
}
}
}
map
和flatMap
方法允许在连接操作时调用任意代码。Slick无法让这些代码在其自身的执行上下文中运行,因为它无法知道您是否会长时间占用Slick的线程。 - srzhio