Как мне моделировать основанные на времени события в 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
И затем ваш поток прослушивания делает разные вещи в зависимости от типа события.