Simon Marlowは、 Haskell eXchange 2012 で高性能同時実行の講演を行いました。時間の制約により、単純な同時チャット サーバーに関するセクションをスキップしました。省略されたコンテンツに興味を持った Web 検索で、サーバー アプリケーションに関する同様のスライドとGitHub 上の実装が見つかりました。
スライド 33読み取り
話を戻します…
talk :: Server -> Handle -> IO () talk server@Server{..} handle = do hSetNewlineMode handle universalNewlineMode hSetBuffering handle LineBuffering readName where readName = do hPutStrLn handle "What is your name?" name <- hGetLine handle m <- checkAddClient server name handle case m of Nothing -> do hPrintf handle "The name %s is in use" name readName Just client -> do runClient server client `finally` removeClient server name
厳密には、 と の間の穴を塞ぐ必要が
checkAddClient
ありfinally
ます (注を参照してください…)
前に、スライド 3で「注記の第 14 章」について言及していますが、これは彼の今後の本を指していると思われます。checkAddClient
との間の同期クラックとは何finally
ですか? どうすればプラグインできますか?
前述の実装ではmask
、from Control.Exception を使用しています。これが修正である場合、タイミングの悪い例外がパーティーを台無しにするシナリオは何ですか?
... readName = do hPutStrLn handle "What is your name?" name <- hGetLine handle if null name then readName else mask $ \restore -> do ok <- checkAddClient server name handle case ok of Nothing -> restore $ do hPrintf handle "The name %s is in use, please choose another\n" name readName Just client -> restore (runClient server client) `finally` removeClient server name