networkライブラリで行われた設計上の決定をよりよく理解しようとしています。評判の良い資料には、a github issueとmailing list responseには、network
にノンブロッキングソケットが使用されています。デフォルトのブロック動作を使用する代わりに、ソケットを読み取る準備ができるまでブロックするにはselectを使用します。なぜこれは良いですか?どちらの方法でも、ブロックが終了し、network
はエンドユーザーにブロックAPIを公開するだけです。私が推測していることは、FFIの呼び出しがブロックされていること、そしてselect
のまわりにGHCの魔法があることが悪いことですが、私はそれを確認できませんでした。なぜhaskellのネットワークライブラリはノンブロッキングソケットを使用していますか?
network
でselect
がどこにあるのかわかりません。コードベースをグッとしても何も起きなかった。私はちょうどGHC.Eventを発見しました。これはselect
を直接呼び出す代わりに使用される機能を提供しているようですが、grepping show network
はこれを使用しません。
ghcランタイムシステムのどこかに選択(またはポーリング)ループがあるはずです。一般に、ghcはどこでも非ブロッキングI/Oを使用しようとします。 – melpomene
これはGHCのグリーンスレッドスケジューラのために(もしかすると)別のスレッドに制御権を与えるために 'yield'ポイントとして使われているのでしょうか?しかしどちらかというと本当に知りません。 – Cubic