11章並行性の高水準な抽象化
ここまでHaskellで並行プログラムを書くための基本的なインタフェースを取り上げてきました。単純な仕事にはそれで十分ですが、大規模でより複雑なプログラムとなると抽象化のレベルを上げる必要があります。
これまで、非同期に操作を実行し結果を待つためのインタフェースとして、Async
を開発しました。この章では、そのインタフェースを見直し、より洗練された機能を追加しましょう。具体的には、親が死んだら自動的にキャンセルされるAsync
を生成する方法を提供し、それを使ってより合成しやすい機能を組み立てましょう。
目標はスレッドの木を組み立てることです。どのような理由にせよスレッドが死んだとき、まず子スレッドは自動的に終了され、親スレッドにそのことが通知されます。そうすれば、スレッドの木は末端からボトムアップに取り壊され、実行中のスレッドが残ってしまうことはありません。さらに、すべてのスレッドには、死んだときに例外を処理して後始末する機会が与えられます。
11.1 スレッド漏れの回避
「10.5 Async再考」のAsync
APIの最終版を見直しましょう。
data Async async :: IO a -> IO (Async a) cancel :: Async a -> IO () waitCatchSTM :: Async a -> STM (Either SomeException a) waitCatch :: Async a -> IO (Either SomeException a) waitSTM :: Async a -> STM a wait :: Async a -> IO a waitEither :: Async a -> Async ...
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.