簡體   English   中英

Haskell:線程和IO類型

[英]Haskell: Thread and IO type

我正在研究Haskell的線程部分。 我嘗試創建2個線程來執行不同的計算。 這是一個非常簡單的功能,僅供練習使用。 像這樣的代碼:

import Control.Concurrent (forkIO)

task4 a b = do
    forkIO $ a^b
    forkIO $ b^a


    if (a^b) > (b^a) then putStrLn ([a] ++ "^"++[b] ++ "=" ++ [a^b] ++ "is bigger!")
                    else putStrLn ([b] ++ "^"++[a] ++ "=" ++ [b^a] ++ "is bigger!") 

我不知道如何與do塊中的類型對偶。 我是否應該創建這樣的線程?

既然已經過去了一段時間,那么使用線程的方法如下:

-- helper function for all other methods
message a b = (show a) ++ " ? " ++ (show b) ++ " " ++ (show . compare a $ b)

threads a b = do
  abVar <- newEmptyMVar
  baVar <- newEmptyMVar
  forkIO $ putMVar abVar (a^b)
  forkIO $ putMVar baVar (b^a)
  ab <- takeMVar abVar
  ba <- takeMVar baVar
  putStrLn $ message ab ba

滿嘴 更糟糕的是,它不再是純粹的。 畢竟,您的程序基本上不過是

simple a b = message (a^b) (b^a)

-- IO version
simpleIO :: Integer -> Integer -> IO ()
simpleIO a b = putStrLn $ simple a b

或者至少它應該表現相同。 如果要並行執行此操作,則無需使用parpseq進行IO

parAB a b = force ab `par` force ba `pseq` message ab ba
  where ab = a^b
        ba = b^a

-- IO version    
parABIO a b = putStrLn $ parAB a b

但是最后,在諸如a^b這樣的簡單任務上使用並行或並發技術不會為您帶來任何好處:

通常在可能稍后但不是立即需要a的值時使用par 同樣,確保a不是一個微不足道的計算也是個好主意,否則,並行生成它的成本將使並行運行所獲得的收益蒙上陰影。

可以使用Criterion進行檢查:

import Control.Concurrent
import Control.Parallel
import Control.DeepSeq
import Criterion.Main

message a b = (show a) ++ " ? " ++ (show b) ++ " " ++ (show . compare a $ b)

simple, parAB :: Integer -> Integer -> String
simpleIO, parABIO, threads :: Integer -> Integer -> IO ()

simple a b = message (a^b) (b^a)

simpleIO a b = putStrLn $ simple a b

parAB a b = force ab `par` force ba `pseq` message ab ba
  where ab = a^b
        ba = b^a

parABIO a b = putStrLn $ parAB a b 

threads a b = do
  abVar <- newEmptyMVar
  baVar <- newEmptyMVar
  forkIO $ putMVar abVar (a^b)
  forkIO $ putMVar baVar (b^a)
  ab <- takeMVar abVar
  ba <- takeMVar baVar
  putStrLn $ message ab ba

main = defaultMain [
  bgroup "simpleIO" 
    [ bench "1531235 123152123" $ whnf (simpleIO 1531235) 123152123
    , bench "2 121351356" $ whnf (simpleIO 2) 121351356
    , bench "12346 415" $ whnf (simpleIO 12346) 415
    ],
  bgroup "parABIO" 
    [ bench "1531235 123152123" $ whnf (parABIO 1531235) 123152123
    , bench "2 121351356" $ whnf (parABIO 2) 121351356
    , bench "12346 415" $ whnf (parABIO 12346) 415
    ],
  bgroup "threads" 
    [ bench "1531235 123152123" $ whnf (threads 1531235) 123152123
    , bench "2 121351356" $ whnf (threads 2) 121351356
    , bench "12346 415" $ whnf (threads 12346) 415
    ]
  ]

更多資源

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM