如何阻止主要终止

时间:2016-08-18 11:47:13

标签: haskell

我有这段代码:

main = do
    _ <- forkIO foo
    _ <- forkIO bar
    return ()

函数foobar启动,但main终止后立即终止。如何让main无限期地运行,但没有做多少?

4 个答案:

答案 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包的一个好例子。

raceconcurrently等功能可能与您正在做的事情特别相关。