Как мне моделировать основанные на времени события в haskell?

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

Он периодически подключается к каждой очереди (мы используем rabbitmq) для измерения глубины очереди. Если основная система в настоящее время потребляет из очереди, и эта очередь имеет сообщения, мы ничего не делаем. Если подключенная очередь пуста, мы переключаемся на очередь с наибольшим количеством сообщений в ней. Если все очереди пусты, мы ничего не делаем. Все идет нормально.

Мне также нужен переключатель на основе времени, такой, чтобы, если основное приложение было подключено к очереди более 1 часа, а очередь пуста, переключайтесь, даже если все остальные очереди пусты.

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

Есть ли идиоматический способ моделирования событий на основе времени в haskell?

1 ответ

Если я вас правильно понимаю, это звучит как работа для Control.Concurrent, Части, которые вы будете использовать, будут forkIO создать один из легких потоков haskell для обработки вашего цикла синхронизации, и Chan получать сигналы синхронизации.

import Control.Concurrent
import Control.Concurrent.Chan
import Control.Monad (forever)

main = do
  -- channel to receive messages from the timing thread
  chan <- newChan :: IO (Chan String)

  -- spawn a new thread to send periodic signals
  forkIO $ forever $ do
    writeChan chan "hi!"
    threadDelay $ 1 * 1000 * 1000 -- delay in microseconds

  -- in the main thread, listen for messages from the chan.
  forever $ readChan chan >>= print 

Чтобы расширить это, вместо того, чтобы писать Stringс Chan Вы могли бы сделать ADT для ваших событий, что-то вроде:

data Event = CheckEvent | SwitchEvent deriving Show

И затем ваш поток прослушивания делает разные вещи в зависимости от типа события.

Другие вопросы по тегам