使用 haskell 重新寫(xiě) Periodic task system 時(shí)变泄,我找不到一個(gè)合適的 timer
于是我就自己實(shí)現(xiàn)了一個(gè)朋腋。
data Timer = Timer { waiter :: MVar () }
newTimer :: IO Timer
newTimer = Timer <$> newEmptyMVar
Timer
初始化一個(gè)空的 waiter
initTimer :: Timer -> IO () -> IO ()
initTimer (Timer {..}) io = do
void $ forkIO $ forever $ do
takeMVar waiter
io
初始化 Timer
時(shí)使用 forever
讓執(zhí)行的 io
進(jìn)入死循環(huán),并用 MVar
的特性讓 io
進(jìn)行等待。
startTimer :: Timer -> Int -> IO ()
startTimer (Timer {..}) delay = do
void $ forkIO $ do
threadDelay delay
putMVar waiter ()
開(kāi)始 Timer
時(shí) forkIO
出一個(gè) thread
, 利用 threadDelay
等待相應(yīng)的時(shí)間后 解鎖 waiter
這樣子一個(gè)簡(jiǎn)單的 Timer
就出來(lái)了。
完整的代碼見(jiàn):Timer.hs
也歡迎讀者們來(lái) star
Periodic task system