私は、数秒ごとに(EOFではない)いくつかのデータを返すように、そしてio.Copy
をbytes.Buffer
に(また決して終わらないように)行うゴルーチンを長生きしています。何かのように:長時間実行されているバイトからバッファーへのコピー
var src io.Reader
var buf bytes.Buffer
func main() {
go io.Copy(&buf, src)
// Do stuff. Read from the buffer periodically.
}
私が理解できないのは、私がそのバッファから読み込もうとすると、奇妙な結果が出るということです。私がbuf.Bytes()
またはioutil.ReadAll(&buf)
または何かを呼び出すかどうかは関係ありません、私はちょうどバッファに何度も何度も書き込まれた最初のバイトを見ます。
https://play.golang.org/p/yn0JPrvohV
私の質問は、私が間違って何をやっているのですか?このようにしてbytes.Buffer
を使用することができますか(io.Copy
と定期的に読んでください)。
bytes.Buffer上のデータのレースがあります。ここではどちらかのプリントそのバッファがいっぱいになっている、または最後のprint文ので、いくつかの間隔を待つ例
read
機能です。あなたのアプリケーションを実行してください。(競争検出機能付き)(https://golang.org/doc/articles/race_detector.html)。 –また、解決しようとしている上位レベルの問題についても説明してください。その問題に対する最良の解決法は、バイトを伴わないかもしれない。バッファ。 –
データ競合条件の他に、コピー・ゴルーチンと読み取りゴルーチンとの間に論理的な同期がないため、読み取りが完了する前にプログラムが終了したり、コピー機能が読み取り呼び出しとリセット呼び出しの間にバッファーに書き込む可能性があります、データを失う。読み込みループと書き込みループの同期が必要です。または、io.PipeのようにFIFOの反対側にある必要があります。 (あなたもシングルケースselect文は必要ありません) – JimB