私はGHCの新しいIOマネージャーについて読んでいます。これは、非同期イベント通知を使用し、I/Oのブロックを回避して高スループットを実現します。
新しい非同期IOコードによる管理の対象となるIOアクティビティはどれですか?ファイルの読み取りと書き込み、およびネットワークアクティビティ?データベースアクセス?マネージャーがブロッキングに頼らなければならない種類のIOはありますか?
epoll
/で管理できるすべてのファイル記述子kqueue
が適格です。I / Oの非同期処理が必要な図書館は、I/Oマネージャーと協力する必要があります。
threadWaitRead
およびthreadWaitWrite
関数を呼び出します。GHC.Conc
EWOULDBLOCK
Handle
これは、およびタイプに対してすでに実行されていSocket
ます。たとえば、Cデータベースライブラリへのバインディングを使用すると、そのライブラリはI / Oマネージャと連携しないため、ブロック動作が発生します。
やや満足のいく答え:
新しいGHCIOマネージャーの中心は、kqueue()/epoll()
イベントループです。したがって、これに基づいて構築できるものはすべて適格であると期待します。現在ではない場合は、後で。特にこれは次のことを意味します。
コード(数か月前に調べたところ、状況が変わった可能性があります)には、優先(検索)キューを介したさまざまな種類のタイムアウトの登録と実行のサポートも含まれています。これは、ほとんどのsleep
ような呼び出しがインターフェイスに便乗している可能性があることを示しています。
データベースアクセスについて:確かに、ネットワークIOソケットを介してデータベースにアクセスすることが多いためforkIO
、別のスレッドでDBアクセスを呼び出して実行することは、実行可能で、高速で、安全である必要があります。アプリケーションの残りの部分へのデータの通信は、同時実行手段の1つ、Chan
またはを使用して実行できますSTM.TChan
。
マネージャーがそれ自体をブロックすることに頼らなければならない種類のIOはないと思いますが、一部のライブラリは新しいIOマネージャーを迂回して、直進する可能性があると想像できます。もちろん、彼らはブロックします。