[英]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.