Как актер Акка может взаимодействовать между потоками - PullRequest
8 голосов
/ 03 марта 2012

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

Казалось, что все актеры akka запускаются в одной и той же ветке, которую они называют.Я рассматриваю актеров как сопроцедуры, которые просто сбрасывали свой стек каждый раз при получении вызова.

Вы можете выполнять огромную цепочку актеров, переключающихся по прямой линии.Каждый прием выполняет небольшую неблокирующую операцию и заставляет другой прием работать дальше.Отсутствует цикл обработки событий, который может обрабатывать сообщения вне системы субъекта.

Я бы хотел перехватить запрос из другого потока, выполнить операции управления и дождаться другого сообщения.

Есть несколько вариантов использования, которые описывают мои потребности.

  1. Существует поток, который постоянно опрашивает данные из некоторых источников.Как только данные соответствуют шаблону, они вызывают обработчик событий, основанный на актерах.Логический контроллер принимает решение и передает его работникам.Там должно быть два постоянных потока.Один поток постоянно работает при опросе, а другой работает асинхронно, чтобы контролировать его работу.Вы не должны позволять актерам akka в первый поток, поскольку они нарушили периоды опроса, и первый поток не должен блокировать игроков, поэтому им нужен другой поток.

  2. Существует какая-то двусторонняя настольная игра.Одна сторона имеет контроллерный поток, который планирует расчет времени, взаимодействует с платой сервера и так далее.Другой поток - это тяжелый вычислительный поток, который перебирает различные варианты и не может быть записан в akka, поскольку он имеет блокирующий характер

Я знаю о существующих фьючерсах akka, но они представляют собой рабочую задачу, котораябегите, как только выстрелите, и выключитесь после выполнения своей цели.Фьючерсы хорошо сочетаются с актерами akka, но не могут выражать зацикленные рабочие потоки.

Система акторов Akka включает в себя различные типы петель сетевых событий.Вы можете использовать его встроенную систему удаленного актера или хорошо известный протокол 0mq.Но использование сети для потоковых взаимодействий для меня кажется чрезмерным.

Какой предполагаемый способ склеить не-akka-поток с akka-одним?Должен ли я написать пару специальных процедур для передачи сообщений потокобезопасным способом?

1 Ответ

5 голосов
/ 03 марта 2012

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

Я считаю более полезным использовать Actor с receiveTimeout для выполнения неблокирующего опроса с интервалом, и когда есть что-то, что опрашивается, он публикует его какому-то другому актору или, возможно, даже EventStream своей ActorSystems для истинного паб-суб действия.

...