8章入出力の重ね合わせ

非同期I/Oを実現するためにMVarとスレッドが使えます。ここでいう「非同期」とは、他の仕事をしている最中に、裏でI/Oを実行することです。

複数のウェブページを並行にダウンロードし、すべてのダウンロードが終わるのを待って次の仕事を続けたいとしましょう。以下の関数を使ってウェブページをダウンロードします。

getURL :: String -> IO ByteString

この関数はGetURL.hsのGetURLモジュールで提供されており、HTTPパッケージが提供するAPIに対する単純なラッパーです。

forkIOMVarを使って、2つのウェブページを同時にダウンロードしてみましょう。

geturls1.hs

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.