#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 также поддерживает субъектов на основе потоков в дополнение к субъектам на основе событий.