import Control.Monad import Control.Concurrent import System.Random import Control.Concurrent.Pool second = 1000000 tester :: Int -> Int -> IO Int tester n m = do th <- myThreadId putStrLn $ "Starting task #" ++ show n ++ " in [" ++ show th ++ "] for " ++ show m ++ " ticks." forM_ [1..m] $ \k -> do putStrLn $ "Task " ++ show n ++ ": " ++ show k ++ "..." -- threadDelay second putStrLn $ "Task " ++ show n ++ ": done." return n resultCollector :: Integer -> Int -> IO () resultCollector task n = putStrLn $ "Task #" ++ show task ++ " ended with result: " ++ show n main = do pool <- newPool 1 True forM_ [1..1000] $ \k -> do timeout <- randomRIO (1,10) queue pool (tester k timeout) () noMoreTasks pool forkIO $ resultsReader pool resultCollector waitFor pool terminatePool pool