Control-Engine-0.0.1: Control/ThreadPool.hs
module Control.ThreadPool
( threadPool
, threadPoolIO
) where
import Control.Monad (forever, forM_)
import Control.Concurrent (forkIO)
import Control.Concurrent.Chan
-- |A trival thread pool for pure functions (mappings). Simply specify the number of threads desired and a mutator function.
threadPool :: Int -> (a -> b) -> IO (Chan a, Chan b)
threadPool nr mutator = do
input <- newChan
output <- newChan
forM_ [1..nr] $
\_ -> forkIO (forever $ do
i <- readChan input
o <- return $! mutator i
writeChan output o)
return (input, output)
-- |A trivial thread pool that allows IO mutator functions. Evaluation of output is not strict
-- - force evaluation if desired!
threadPoolIO :: Int -> (a -> IO b) -> IO (Chan a, Chan b)
threadPoolIO nr mutator = do
input <- newChan
output <- newChan
forM_ [1..nr] $
\_ -> forkIO (forever $ do
i <- readChan input
o <- mutator i
writeChan output o)
return (input, output)