2017-02-11 4 views
-1

私のコードは複雑ではありませんが、単純に言えば複数のgoルーチンを持っていて、すべて異なるtcpサーバーをダイヤルして、読み取り可能なメッセージがストリーム上に存在します。ここまでは順調ですね。今、「クライアント」の前の束を管理し、ユーザーが望むときにそれらを閉じるルーチンがあります。そのために、私はそれぞれの「conn」を適切なルーチンのクライアントに関連付け、それを閉じています。conn.readは他のgoルーチン経由でconnを閉じると無限ループになる

私が直面している問題は、connオブジェクトのclose関数を呼び出すとすぐに、対応するRead関数が無限ループ内で空の文字列を連続的に読み取ることになります。

私は複数での接続がhttps://play.golang.org/p/wq7zt9Kqz7

TL routines-行く取り扱いしています方法に似ている単純なコードを書きました。要するにDR

私は1つを表し、「クラス」を持っていますリモートサーバのアドレス、conn、waitgroupが入っています。私は複数のインスタンスを作成し、別々のgoルーチンで入力を処理しています。そして、もう1つのルーチンでは、これらのインスタンスの1つを閉じようとしています。このread()は無期限にループします。

+0

私はサンプルコードがそれについて何も言わないので、私は質問しています。また、サンプルコードはサブルーチンを正しく終了しているかどうかを記録しません。 – Fallen

答えて

0

私はセマフォ(チャンネル、内部メソッドを選択する)を使用する必要があると思いますので、stopを呼び出すとメッセージ(ブール値またはint)を送信し、メソッドがこのチャンネルからメッセージを取得すると、 go rutineをやめてください。あなたが閉じられた接続であっ Stackoverflow

+0

チャンネルが私の最初の選択でしたが、問題は私が "リモートサーバー"のインスタンスを動的に作成したいと思っていたことでした。待機グループの場合は、新しいサーバーの要求があるたびにループ内で簡単にwg.Add(1)を使用しました。 – darthvading

1

Read見つけることができます

ショート例

select{ 
case <- stopChannel: 
//Do stuff to close connection 
case default: 
//Do stuff to read from connection 
} 

詳しい例はエラーを返します。

TCP接続でReadから返されたエラーが発生した場合、アプリケーションは読み取りループから抜け出す必要があります。エラー時にブレークすると、これらのすべてのケースが処理されます。アプリケーションは別のゴルーチンで接続を閉じ、ピアは接続をシャットダウンし、ネットワークエラーです。

TCP接続のより近いものとその接続のリーダーとを調整するために、他の同期は必要ありません。

関連する問題