实现一个简单的 Timer

使用 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 ()

开始 TimerforkIO 出一个 thread, 利用 threadDelay 等待相应的时间后 解锁 waiter

这样子一个简单的 Timer 就出来了。

完整的代码见:Timer.hs

也欢迎读者们来 star Periodic task system

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容