使用 haskell 重新写 Periodic task system 时,我找不到一个合适的 timer 于是我就自己实现了一个。
data Timer = Timer { waiter :: MVar () }
newTimer :: IO Timer
newTimer = Timer <$> newEmptyMVar
Timer 初始化一个空的 waiter
initTimer :: Timer -> IO () -> IO ()
initTimer (Timer {..}) io = do
void $ forkIO $ forever $ do
takeMVar waiter
io
初始化 Timer 时使用 forever 让执行的 io 进入死循环,并用 MVar 的特性让 io 进行等待。
startTimer :: Timer -> Int -> IO ()
startTimer (Timer {..}) delay = do
void $ forkIO $ do
threadDelay delay
putMVar waiter ()
开始 Timer 时 forkIO 出一个 thread, 利用 threadDelay 等待相应的时间后 解锁 waiter
这样子一个简单的 Timer 就出来了。
完整的代码见:Timer.hs
也欢迎读者们来 star Periodic task system