我有这段代码:
main = do
_ <- forkIO foo
_ <- forkIO bar
return ()
函数 foo
和 bar
开始运行,但只要 main
终止,它们就会终止。我该如何让 main
无限期地运行,但不做太多事情呢?
我有这段代码:
main = do
_ <- forkIO foo
_ <- forkIO bar
return ()
函数 foo
和 bar
开始运行,但只要 main
终止,它们就会终止。我该如何让 main
无限期地运行,但不做太多事情呢?
使用 async
包可以很好地将其封装为 concurrently foo bar
。
这是一个自包含的 stack
shebang 脚本。
#!/usr/bin/env stack
{- stack
--resolver lts-6.12
--install-ghc
runghc
--package async
-}
import Control.Concurrent
import Control.Concurrent.Async
forever :: String -> Int -> IO ()
forever msg delay = loop
where
loop = do
putStrLn msg
threadDelay (delay * 1000)
loop
foo = forever "foo" 3000
bar = forever "bar" 5000
main = foo `concurrently` bar
您可以使用MVar ()
作为简单的信号量。例如
main = do
vFoo <- newEmptyMVar
vBar <- newEmptyMVar
forkIO (foo vFoo)
forkIO (bar vBar)
takeMVar vFoo
takeMVar vBar
foo vFoo = do
...whatever...
putMVar vFoo ()
bar vBar = do
...whatever...
putMVar vBar ()
getChar
使主线程等待输入。这也为你提供了一个方便的方法来真正退出程序。或者如果你不想那样做,只需在 getChar
上进行递归即可。
MVar
。do { v <- newEmptyMVar; forkIO (foo >> putMVar v ()); forkIO (bar >> putMVar v ()); takeMVar v; takeMVar v }
- Daniel WagnertakeMVar
调用或使其不太明显的可能性,但对于仅有的 两个 线程来说,这应该没问题。 - MathematicalOrchid