2013-02-11 9 views
6

私はHaskellにサーバーを書いていますが、切断した後で明示的にクライアントハンドルを閉じることを望みます。 hCloseに電話すると、クライアントがハンドルの側を閉じるまで、スレッドはブロックされます。ブロックせずに閉じる方法はありますか?Haskell hClose blocking

ありがとうございます!

+0

非同期で起動しますか? http://hackage.haskell.org/packages/archive/async/2.0.1.4/doc/html/Control-Concurrent-Async.htmlをチェックしてください。 – jozefg

+2

[conduits]のような高レベルのライブラリを使用することをお勧めします( http://hackage.haskell.org/package/conduit)。それはあなたのためのすべてのこの低レベルのものを処理し、あなたは実際のアプリケーションロジックの実装に集中することができます。 –

答えて

10

確かに、ちょうど別のスレッドで実行します:

import Control.Concurrent (forkIO) 

forkIO (hClose handle) 

をjozefgが述べたように、あなたは、このようなasyncに見られるような手の込んだソリューションを使用することができますが、私はこのケースでの理由が表示されません。

+0

これはもちろん、関連するハンドルから読み取ってブロックされたスレッドのブロックを解除するわけではありません。読者を適切にブロック解除するソリューションは、Network.Socketのソケットから読み取るための関数を使用することですが、それはそれ自体の頭痛があります...自己記述された低レベルインタフェースがスレッドではなく、しない... – javawizard