2016-12-17 13 views
1

私はclojure.asyncを使用してソケットへの読み書きを抽象化するためのいくつかの関数を書いています。私の意図は、値をチャンネルに書き込んで書き込んだり、チャンネルからポップして読み込んだりすることです。このようにして、ユーザーはReader s/Writer秒を心配する必要はありません。BufferedReader - ストリームの終わりでブロックする

以下のコードはループ内のソケットから読み取ったものを、チャネルに読み込んだものを転送します。チャネルは読み込み可能に返されます。私の問題は、ストリームの終わりに達すると、ブロックするのではなく、何かを読むことができるまでスピンしているということです。これらのプロセスのいくつかを行っている場合、私のコンピュータで顕著なパフォーマンスの問題が発生します。

これを修正するための最も簡単な方法は、nilを返すのではなく、BufferedReaderreadLineブロックがEOFにあることです。私が見ることができるから、これは不可能です。しかし、ほとんどのストリームでEOFをブロックすることは非常に奇妙なので、私は驚いていません。しかし、ソケットストリームについては、EOFに達してもメッセージを受信できるので、EOFは特定の意味を持たないようです。

EOFに達したら入力を待っている間にループが回転しないようにする方法はありますか?

+0

リッチ・ヒッキーは、これはいい考えではなく、core.asyncのために気にしていたものではないと数回述べました。この背後にある根拠を完全に理解するために、彼のcore.asyncの会話を見たいかもしれません。探している抽象化を実装し、core.asyncと統合するmanifoldやalephのようなZach Tellmansのライブラリを見てください。 –

+0

@LeonGrapenthinあなたは、講演にリンクしていますか?私はそれらを見たいと思います。 :-) – jszakmeister

答えて

0

ここで唯一のことはあなたです。使用しているクラスのメソッドはどれもスピンしません。 isConnectedisClosedまたはisInputShutdownのドキュメントを読んで、解決策が明確になるはずです。 readLineの説明を読むのにも役立つでしょう。これは、読む入力がなくなったときに何が返ってくるかを非常に明確に示しています。

+0

私はこの答えが答えるはずのものは本当にわかりません。私は 'getLine'のドキュメントを読んだことがあります。注目すべきは、「ストリームの終わりに達した場合はnullを返す」という部分です。ストリームの終わりを示すnullが返されたとき、 '(valid-message?line)'はfalseになり、ループは制御できなくなります。迅速なループを防ぐ方法を知りたい。そして、私は 'inConnected'を使用して間違いを知り、ソケットが接続されているのではなく開いている間だけループを試み、動作は変わりませんでした。 – Carcigenicate

+0

これは答えのリンクでもあります。 – Carcigenicate

+1

ストリームの最後を読み取ると、ストリームの最後にいます。入ってくるメッセージは決してもう一つもありません。それが流れの終わりが意味するものです。それは「今は何もない」という意味ではありません。 – amalloy

0

EOF以降であっても、読み取るべき部分があるかどうかを確認することができます(java.io.BufferedReader.ready())。また、Socketsは、単に(clojure.java.io/reader socket)を使用してBufferedReaderに強制することができます。ライターと同じです。

私はcore.asyncとはあまりよく慣れていないので、それが役立つかどうかわかりません。

関連する問題