Идеи для регулирования частоты обновления - PullRequest
4 голосов
/ 27 июля 2011

Вот моя ситуация, у меня есть внешняя программа, которая отправляет мне данные каждые 30 или около того мс.Эти данные объединяются в ссылку.

На данный момент у меня

(def state (ref {})

отдельное будущее читает и объединяет пакеты в эту ссылку.конечный автомат, который принимает решения и отправляет обратно команды управления.В основном каждое состояние имеет следующую структуру:



(while (some-thing-happening)
   (calc-stuff)
   (send-correction))

Вот моя проблема, если я получаю 100 пакетов / сек, нет смысла отправлять 200 команд / сек.Поэтому я хотел бы придумать схему, которая будет ограничивать частоту обновления.Я не могу спать в течение нескольких мс, потому что частота обновления не является детерминированной.Как бы вы это структурировали?

Ответы [ 2 ]

1 голос
/ 27 июля 2011

Во-первых, вам нужна мера, чтобы предотвратить работу, пока данные не поступают.Вы можете сделать это,

  1. Получение обратного вызова при поступлении пакетов, который продвигает ваш конечный автомат.Используйте это, если ваш IO API имеет обратные вызовы.
  2. Блокировка в some-thing-happening до прибытия пакета.Используйте это, если API разрешает это, и обратного вызова нет.
  3. Записывайте входящие пакеты в BlockingQueue и считывайте их с вашего конечного автомата.Это эмулирует 2.

Во-вторых, вы можете смоделировать свое состояние в качестве агента:

(def state (agent {}))

Таким образом, вы можете сказать

(defn update-state [state data]
  ; e.g.
  (merge state data))

;; in the state machine
(send state correct data)

, который обновляет ваше состояние в отдельном потоке.


Вы даже можете отправлять пакеты агенту непосредственно с того места, где вы их читаете, и внедрять конечный автомат в update-state.

0 голосов
/ 27 июля 2011

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

Или, используйте другой ref как флаг и установите его в true при обновлении данных, добавьте флаг как условие в цикл while. И сбросьте его на false после обновления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...