Как настроить субъект Scala на использование исключительно отдельного потока для запуска?

#multithreading #scala #actor

#многопоточность #scala #актер

Вопрос:

Насколько я понимаю, Scala управляет пулом потоков для запуска актеров, разделяя потоки между ними. Могу ли я настроить конкретного актера на запуск исключительно в отдельном потоке, никогда не делясь им с другим актером?

Комментарии:

1. @pablo-fernandez для java.lang.Thread.sleep(long millis) безопасного использования, без замораживания любых других актеров, которые могут использовать тот же поток. Фактическая задача состоит в том, чтобы создать субъект таймера, спящий между отправкой сообщений tick.

2. Я бы использовал фреймворк executor, если вам нужен более точный контроль над количеством задействованных потоков

Ответ №1:

Похоже, вы используете актеров Scala (не Akka). В этом случае, если вы используете стиль обработки сообщений receive или receiveWithin , то каждый субъект получит свой собственный поток. Использование react стиля обработки сообщений разделяет пул потоков между субъектами.

Когда я говорю receive «стиль», я имею в виду, например, в цикле:

 val timerActor = actor { 
  while (true) {
    receiveWithin(60 * 1000) {
       case Stop => self.exit()
       case TIMEOUT =>
          destination ! Tick
    }
  }
}
  

В этом случае timerActor не делится своим потоком ни с каким другим субъектом. receiveWithin будет блокироваться до тех пор, пока субъект не получит сообщение об остановке или не пройдет 60 секунд. Если проходит 60 секунд, то выполняется ТАЙМ-аут.

Если вы хотите узнать более подробные сведения об актерах Scala, ознакомьтесь со статьей Актеры, которые объединяют потоки и события.

Akka также поддерживает субъектов на основе потоков в дополнение к субъектам на основе событий.