[英]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
或者至少它應該表現相同。 如果要並行執行此操作,則無需使用par
和pseq
進行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.