为什么 Akka 在没有任务时关闭调度程序?
Why Akka shutdowns dispatcher, when there is no tasks?
我想要固定线程池,其中包含一次创建的线程。所以,我创建了自己的 ExecutorServiceConfigurator
:
class FixedThreadPoolExecutorServiceConfigurator(config: Config, prerequisites: DispatcherPrerequisites) extends ExecutorServiceConfigurator(config, prerequisites) {
class ThreadPoolExecutorServiceFactory extends ExecutorServiceFactory {
def createExecutorService: ExecutorService = {
Executors.newFixedThreadPool(40)
}
}
private val executor = new ThreadPoolExecutorServiceFactory()
override def createExecutorServiceFactory(id: String, threadFactory: ThreadFactory): ExecutorServiceFactory = {
executor
}
}
并使用它:
blocking-dispatcher {
type = Dispatcher
executor = "abc.FixedThreadPoolExecutorServiceConfigurator"
throughput = 1
thread-pool-executor {
fixed-pool-size = 60
}
}
但是每次,当我的程序没有任何任务时,Akka 都会关闭 ExecutorService:
akka.dispatch.MessageDispatcher:
private val shutdownAction = new Runnable {
@tailrec
final def run(): Unit = {
shutdownSchedule match {
case SCHEDULED ⇒
try {
if (inhabitants == 0) shutdown() //Warning, racy
}
//////
}
}
}
我无法理解这种行为。我认为,创建线程是一项昂贵的操作。
你能粘贴你的主应用程序代码吗,当没有任务可用时,它会被终止。
如果您正在创建 ActorSystem
,那么除非您终止它,否则您的应用程序将不会退出,因为它确实创建了一些用户线程,使您的应用程序保持 运行.
它不会在 运行 没有任务时停止执行程序。只有当该调度程序的最后一个 actor 停止并且超时已过(shutdown-timeout
在调度程序配置上)并且没有启动分配给调度程序的新 actor 时,才会关闭 运行。
对于调度器的用例,它有许多短命的演员和没有演员的时期 运行ning > 1 秒,这是默认值,您可以将设置调整到更高的值以保持执行者还活着。
我想要固定线程池,其中包含一次创建的线程。所以,我创建了自己的 ExecutorServiceConfigurator
:
class FixedThreadPoolExecutorServiceConfigurator(config: Config, prerequisites: DispatcherPrerequisites) extends ExecutorServiceConfigurator(config, prerequisites) {
class ThreadPoolExecutorServiceFactory extends ExecutorServiceFactory {
def createExecutorService: ExecutorService = {
Executors.newFixedThreadPool(40)
}
}
private val executor = new ThreadPoolExecutorServiceFactory()
override def createExecutorServiceFactory(id: String, threadFactory: ThreadFactory): ExecutorServiceFactory = {
executor
}
}
并使用它:
blocking-dispatcher {
type = Dispatcher
executor = "abc.FixedThreadPoolExecutorServiceConfigurator"
throughput = 1
thread-pool-executor {
fixed-pool-size = 60
}
}
但是每次,当我的程序没有任何任务时,Akka 都会关闭 ExecutorService:
akka.dispatch.MessageDispatcher:
private val shutdownAction = new Runnable {
@tailrec
final def run(): Unit = {
shutdownSchedule match {
case SCHEDULED ⇒
try {
if (inhabitants == 0) shutdown() //Warning, racy
}
//////
}
}
}
我无法理解这种行为。我认为,创建线程是一项昂贵的操作。
你能粘贴你的主应用程序代码吗,当没有任务可用时,它会被终止。
如果您正在创建 ActorSystem
,那么除非您终止它,否则您的应用程序将不会退出,因为它确实创建了一些用户线程,使您的应用程序保持 运行.
它不会在 运行 没有任务时停止执行程序。只有当该调度程序的最后一个 actor 停止并且超时已过(shutdown-timeout
在调度程序配置上)并且没有启动分配给调度程序的新 actor 时,才会关闭 运行。
对于调度器的用例,它有许多短命的演员和没有演员的时期 运行ning > 1 秒,这是默认值,您可以将设置调整到更高的值以保持执行者还活着。