使用Haskell编写一个简单的多线程应用程序
发布时间:2023-12-10 03:31:21
下面是一个使用Haskell编写的简单的多线程应用程序的例子:
import Control.Concurrent
import Control.Monad
-- 定义一个简单的任务
task :: String -> IO ()
task str = do
threadId <- myThreadId
putStrLn $ "Task \"" ++ str ++ "\" started on thread " ++ show threadId
threadDelay (1 * 1000 * 1000) -- 模拟任务执行时间 1 秒
putStrLn $ "Task \"" ++ str ++ "\" completed on thread " ++ show threadId
main :: IO ()
main = do
-- 创建一个线程池
threadPool <- newChan
replicateM_ 10 $ forkIO $ forever $ do
task <- readChan threadPool
task
-- 向线程池中添加任务
putStrLn "Adding tasks to thread pool..."
writeChan threadPool "Task 1"
writeChan threadPool "Task 2"
writeChan threadPool "Task 3"
writeChan threadPool "Task 4"
writeChan threadPool "Task 5"
-- 等待所有任务完成
threadDelay (5 * 1000 * 1000) -- 模拟等待 5 秒
上述代码中,我们首先定义了一个简单的任务函数 task,该函数接收一个字符串参数,输出任务开始和完成的信息,并模拟任务执行时间。
在 main 函数中,我们首先创建了一个线程池 threadPool,使用 newChan 函数创建一个新的通道。接着,使用 replicateM_ 和 forkIO 函数创建了 10 个子线程,每个线程都会无限循环从 threadPool 中读取任务并执行。
随后,我们向线程池中添加了 5 个任务,并在控制台输出任务添加的信息。最后,使用 threadDelay 函数模拟等待 5 秒,以确保所有任务都被执行完毕。
该程序使用了 Haskell 并发库中的线程相关函数,包括 forkIO、myThreadId 和 threadDelay。它通过创建一个线程池来管理多线程任务的执行,并实现了简单的任务添加和执行逻辑。
在实际使用时,可以根据需求修改任务函数的实现和任务的数量,以及添加其他的并发控制功能,例如使用锁或信号量等。
