8章入出力の重ね合わせ
非同期I/Oを実現するためにMVar
とスレッドが使えます。ここでいう「非同期」とは、他の仕事をしている最中に、裏でI/Oを実行することです。
複数のウェブページを並行にダウンロードし、すべてのダウンロードが終わるのを待って次の仕事を続けたいとしましょう。以下の関数を使ってウェブページをダウンロードします。
getURL :: String -> IO ByteString
この関数はGetURL.hsのGetURL
モジュールで提供されており、HTTP
パッケージが提供するAPIに対する単純なラッパーです。
forkIO
とMVar
を使って、2つのウェブページを同時にダウンロードしてみましょう。
import Control.Concurrent import Data.ByteString as B import GetURL main = do m1 <- newEmptyMVar -- ① m2 <- newEmptyMVar -- ② forkIO $ do -- ③ r <- getURL "http://www.wikipedia.org/wiki/Shovel" putMVar m1 r forkIO $ do -- ④ r <- getURL "http://www.wikipedia.org/wiki/Spade" putMVar m2 r r1 <- takeMVar m1 -- ⑤ r2 <- takeMVar m2 -- ⑥ print (B.length r1, B.length r2) -- ⑦
- ① ② 結果を保持するための空の
MVar
を2つ生成します。 - ③ 新しいスレッドを生成して1つ目のURLをダウンロードします。ダウンロードが終ったら結果を ...
Get Haskellによる並列・並行プログラミング now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.