欢迎访问宙启技术站
智能推送

使用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 并发库中的线程相关函数,包括 forkIOmyThreadIdthreadDelay。它通过创建一个线程池来管理多线程任务的执行,并实现了简单的任务添加和执行逻辑。

在实际使用时,可以根据需求修改任务函数的实现和任务的数量,以及添加其他的并发控制功能,例如使用锁或信号量等。