2010-12-15 11 views
32

私はGHCの新しいIOマネージャーについて読んできました.GHCは、非同期イベント通知を使用し、I/Oを阻止して高いスループットを達成することを避けています。GHC IOマネージャはどのIOアクティビティをサポートしていますか?

新しい非同期IOコードによって管理できるIOアクティビティはどれですか?ファイルやネットワーク活動の読み書きデータベースアクセス?管理者がブロッキングに頼らざるを得ない種類のIOがありますか?

+2

ワウ... 4つのお気に入りですが、アップヴォートは1つだけです。それは奇妙だ。 – fuz

+0

@FUZxxl StackOverflowはお気に入りのものがありますか?私は全くあなたのコメントのために気づいた。 – alternative

+0

@monadicはい、あります。お気に入りの質問のすぐ下にあるスタートボタンを押してください。何か変更があった場合、あなた自身の質問であるかのように通知を受け取ります。 – fuz

答えて

26

epoll/kqueueで管理できるファイルディスクリプタはすべて対象です。 I/Oの非同期治療をしたいライブラリがシステムコール再試行する前にGHC.ConcthreadWaitReadthreadWaitWrite関数を呼び出すファイルディスクリプタノンブロッキング作り、そして

    • によってI/Oマネージャと協力する必要があります以前に返されたEWOULDBLOCK

    これはすでにHandleSocketタイプで行われています。たとえば、 Cデータベースライブラリへのバインディングは、そのライブラリがI/Oマネージャと連携しないため、ブロック動作を行います。

  • +8

    「tibbe」はおそらく*この分野の人を知っていることに気づくかもしれません:) –

    5

    やや満足のいく答え:

    新しいGHC IOマネージャーの心はkqueue()/epoll()イベントループです。だから私はこれの上に構築することができるものは、適格であると期待します。特に、これは意味:

    • ファイルIO
    • ネットワークIOを

    コード(私は数ヶ月前にそれを見て、物事が変更されている場合があります)また、各種のタイムアウトを登録し、実行するためのサポートが含まれています優先度(検索)キューを介して種類を指定します。これは、ほとんどのsleepのような呼び出しは、インターフェイス上でピギーバックすることができることを示唆しています。

    データベースアクセスについて:ネットワークIOソケットを介してデータベースに頻繁にアクセスするので、別のスレッドでforkIOを呼び出してDBアクセスを行うことは、実行可能で、速く、安全でなければなりません。アプリケーションの残りの部分にデータを返信するには、並行処理手段の1つ、ChanまたはSTM.TChanを使用します。

    私は、管理者がブロック自体に頼らざるを得ない種類のIOがあるとは思っていませんが、いくつかのライブラリが新しいIOマネージャを迂回して頚動脈にまっすぐ進むかもしれません。彼らはもちろん、ブロックするでしょう。

    関連する問題