2015-04-22 4 views
0

Я новичок в Акку-актера и спутать с некоторыми проблемами:Num экземпляра актера

  1. когда я создать actorSystem и использовать actorOf (Реквизит (classOf [AX], ...)) в создать актера в основном методе, сколько экземпляров для моего актера AX?
  2. Если ответ на Q1 был всего один, означает ли это, что любая структура данных, которую я создал в определении класса актера AX, будет отображаться только в одном потоке, и я не должен беспокоиться о проблемах параллелизма?
  3. Что делать, если одно из действий моего актера (один случай в методе приема) является трудоемкой задачей и займет довольно много времени? Будет ли мой единственный экземпляр Actor не отвечать, пока он не завершит эту задачу?
  4. Если ответ на вопрос Q3 прав, что я должен сделать, чтобы не дать моему актеру не отвечать? Должен ли я запустить другой поток и отправить еще одно сообщение до завершения задачи? Есть ли лучшая практика там, где я должен следовать?

ответ

3
  1. да, система актер будет создавать только 1 экземпляр для актера каждый раз, когда вы вызовите метод «actorOf». Однако при использовании маршрутизатора можно создать 1 маршрутизатор, который распределяет нагрузку на любое количество участников. Таким образом, в этом случае можно построить несколько экземпляров, но «обычно» с использованием actorOf просто создает 1 экземпляр.

  2. Да, в рамках актера вам не нужно беспокоиться о параллелизме, потому что Akka гарантирует, что любой актер обрабатывает только одно сообщение в то время. Вы должны позаботиться о том, чтобы каким-то образом изменить состояние актера из кода вне актера. Поэтому всякий раз, когда выставляете актерское состояние, всегда делайте это, используя неизменный класс. Классы классов отлично подходят для этого. Но также можно модифицировать состояние актера при завершении Будущего изнутри актера. Поскольку Future работает над собственным потоком, вы можете столкнуться с проблемой параллелизма, когда Future завершает работу, и актер одновременно обрабатывает следующее сообщение. Актер выполняет по 1 нити в то время, но это может быть другой поток каждый раз, когда актер выполняет.

  3. Akka - это высококонкурентная и распределенная структура, все асинхронно и неблокируется, и вы должны делать то же самое в своем приложении. Scala и Akka предлагают несколько решений для этого. Всякий раз, когда у вас есть трудоемкая задача внутри актера, вы можете либо делегировать трудоемкую задачу другому актеру только для этой цели, использовать фьючерсы, либо использовать «асинхронный/ожидающий/блокирующий» Scala. При использовании «блокировки» вы даете намек на компилятор/время выполнения, действие блокировки выполняется, и среда выполнения может запускать дополнительный поток, чтобы предотвратить голодание. Scala Concurrent programming book - отличное руководство для изучения этого материала. Также посмотрите на concurrent package ScalaDocs и Neophyte's Guide to Scala. Если актеру действительно нужно дождаться выполнения трудоемкой задачи, тогда да, ваш актер может ответить только тогда, когда это будет завершено. Но это очень продуманный способ «запроса-ответа». Попытайтесь уйти от этого. Актер также мог немедленно ответить, указав, что задача запущена, и отправить дополнительное сообщение после завершения задачи. С трудоемкими задачами всегда нужно использовать другой пул потоков, поэтому система ActorSystem не будет заблокирована, потому что все доступные потоки будут расходоваться на трудоемкие задачи. Для Future's вы можете предоставить отдельный ExecutionContext (не используйте контекст Disport для ActorSystem для этого!), Но через конфигурацию Akka вы также можете настроить некоторых участников для работы в другом пуле потоков.

  4. См 3.

Успех!

1
  1. один экземпляр (если объявить маршрутизатор в вашем реквизите тогда (могут быть) больше одного)
  2. Да. Это одно из преимуществ актеров.
  3. Да. Актер будет обрабатывать сообщения последовательно.
  4. Вы можете использовать scala.concurrent.Future (не использовать состояние актера в будущем) или делегировать работу дочернему актору (главный актер может управлять состоянием и отвечать на сообщения). Будущий или ребенок-актер зависит от варианта использования.
Смежные вопросы