2017-01-13 16 views
7

networkライブラリで行われた設計上の決定をよりよく理解しようとしています。評判の良い資料には、a github issuemailing list responseには、networkにノンブロッキングソケットが使用されています。デフォルトのブロック動作を使用する代わりに、ソケットを読み取る準備ができるまでブロックするにはselectを使用します。なぜこれは良いですか?どちらの方法でも、ブロックが終了し、networkはエンドユーザーにブロックAPIを公開するだけです。私が推測していることは、FFIの呼び出しがブロックされていること、そしてselectのまわりにGHCの魔法があることが悪いことですが、私はそれを確認できませんでした。なぜhaskellのネットワークライブラリはノンブロッキングソケットを使用していますか?

networkselectがどこにあるのかわかりません。コードベースをグッとしても何も起きなかった。私はちょうどGHC.Eventを発見しました。これはselectを直接呼び出す代わりに使用される機能を提供しているようですが、grepping show networkはこれを使用しません。

+1

ghcランタイムシステムのどこかに選択(またはポーリング)ループがあるはずです。一般に、ghcはどこでも非ブロッキングI/Oを使用しようとします。 – melpomene

+0

これはGHCのグリーンスレッドスケジューラのために(もしかすると)別のスレッドに制御権を与えるために 'yield'ポイントとして使われているのでしょうか?しかしどちらかというと本当に知りません。 – Cubic

答えて

7

ノンブロッキングIOイベントループは、GHCのランタイムシステム(RTS)の一部です。これは、GHCのグリーンスレッドシステムと非常にうまくやりとりします。非同期コードを書くのではなく、軽量のスレッドを使うだけで、ランタイムは正しいものを目覚めさせます。

すべてのIOin in Haskellはデフォルトで非ブロッキングなので、異なるソケットでブロックされた2つのスレッドがある場合、ランタイムシステムは内部でselect(または他のプラットフォーム固有の方法epollまたはkqueueのような複数のファイル記述子を待ちます)は、ファイル記述子が準備完了になったときにスレッドを起動するだけです。詳細はhttps://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts/IOManagerを参照してください。

+0

'network'が' select'の代わりに 'epoll'に依存していれば、そのモデルにはうまく適合しませんか? – sapanoia

+2

それはLinux上で 'epoll'をacutly使っているかもしれません。 @sapanoia参照http://stackoverflow.com/a/39106000/2494803 – bennofs