我有这段代码:
main = do
_ <- forkIO foo
_ <- forkIO bar
return ()
函数foo
和bar
启动,但main
终止后立即终止。如何让main
无限期地运行,但没有做多少?
答案 0 :(得分:10)
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
答案 1 :(得分:5)
您可以做的一件事是使用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 ()
答案 2 :(得分:1)
您可以调用getChar
,以便您的主线程等待输入。这也可以为您提供一种真正退出程序的便捷方式。或者,如果您不想要,只需重复getChar
。
答案 3 :(得分:1)
根据您在两个线程中的一个失败的情况下所需的行为,这可能是async包的一个好例子。
race
和concurrently
等功能可能与您正在做的事情特别相关。