私はclojure.asyncを使用してソケットへの読み書きを抽象化するためのいくつかの関数を書いています。私の意図は、値をチャンネルに書き込んで書き込んだり、チャンネルからポップして読み込んだりすることです。このようにして、ユーザーはReader
s/Writer
秒を心配する必要はありません。BufferedReader - ストリームの終わりでブロックする
以下のコードはループ内のソケットから読み取ったものを、チャネルに読み込んだものを転送します。チャネルは読み込み可能に返されます。私の問題は、ストリームの終わりに達すると、ブロックするのではなく、何かを読むことができるまでスピンしているということです。これらのプロセスのいくつかを行っている場合、私のコンピュータで顕著なパフォーマンスの問題が発生します。
これを修正するための最も簡単な方法は、nil
を返すのではなく、BufferedReader
のreadLine
ブロックがEOFにあることです。私が見ることができるから、これは不可能です。しかし、ほとんどのストリームでEOFをブロックすることは非常に奇妙なので、私は驚いていません。しかし、ソケットストリームについては、EOFに達してもメッセージを受信できるので、EOFは特定の意味を持たないようです。
EOFに達したら入力を待っている間にループが回転しないようにする方法はありますか?
リッチ・ヒッキーは、これはいい考えではなく、core.asyncのために気にしていたものではないと数回述べました。この背後にある根拠を完全に理解するために、彼のcore.asyncの会話を見たいかもしれません。探している抽象化を実装し、core.asyncと統合するmanifoldやalephのようなZach Tellmansのライブラリを見てください。 –
@LeonGrapenthinあなたは、講演にリンクしていますか?私はそれらを見たいと思います。 :-) – jszakmeister