Почему Акка отключает диспетчер, когда нет задач? - PullRequest
0 голосов
/ 20 февраля 2019

Я хочу иметь фиксированный пул потоков с когда-то созданными потоками.Итак, я создаю собственный 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
        } 
      ////// 
    }
  }
}

Я не могу понять это поведение.Я думаю, что создание потоков - это дорогостоящая операция.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Не останавливает исполнителя, когда у него заканчиваются задачи.Завершение работы выполняется только в том случае, если последний актер этого диспетчера остановлен и истекло время ожидания (shutdown-timeout в конфигурации диспетчера), когда новые актеры, назначенные диспетчеру, не запущены.

Для случая использования сДиспетчер со многими недолговечными актерами и периодами отсутствия действующих акторов длительностью> 1 секунды, что является значением по умолчанию, которое вы могли бы потенциально настроить на гораздо более высокое значение, чтобы сохранить исполнителя.

0 голосов
/ 20 февраля 2019

Можете ли вы вставить свой основной код приложения, который завершается, когда нет доступных задач.

Если вы создаете ActorSystem, то, если вы не прекратите это, ваше приложение не закроется, поскольку оно создает некоторые пользовательские потоки.который поддерживает работу вашего приложения.

...