Subscribed unsubscribe Subscribe Subscribe

Control.Concurrent.Chan

Haskell

最小サンプル。生産者がチャネルに一秒ごとにインクリメントされていく値を書き込み、複数の消費者がチャネルから読み出した値をプリントする。とってもお手軽。

import Control.Monad
import Control.Concurrent

type ID = Int

main :: IO ()
main = do
  ch <- newChan
  sequence_ $ zipWith ($) (replicate 5 (forkIO . consumer ch)) [0..]
  producer ch

producer :: Chan Int -> IO ()
producer ch = loop ch 0
  where loop ch n = do
          writeChan ch n
          threadDelay (10^6 :: Int)
          loop ch (n+1)

consumer :: Chan Int -> ID -> IO ()
consumer ch n = forever $ do
  v <- readChan ch
  print (n, v)