基盤となるロジックを理解するために何時間も費やしてきましたが、進歩はありませんでした。以下のコードは、最初の反復後にデッドロックを返します。 io.copy
の前にライターを閉じると、デッドロックは解消されますが、何も出力されません (パイプの書き込み側が読み取り前に閉じられるため)
これはコード実行後のエラーです
func main() { reader, writer := io.pipe() c := make(chan string) go func() { for i := 0; i < 5; i++ { text := fmt.sprintf("hello %vth time", i+1) c <- text } close(c) }() for msg := range c { msg = fmt.sprintf("\nreceived from channel -> %v\n", msg) go fmt.fprint(writer, msg) io.copy(os.stdout, reader) writer.close() } }
io.copy
リーダーが eof に達するまでコピーを試み続けます (この場合、パイプが閉じられているとき)。 。 io.copy
が終了した後に writer.close()
after を呼び出すため、io.copy
は決して表示されず、ハングします。永遠に。
コードに関するもう 1 つの問題は、パイプを複数回 (ループ コードが繰り返されるたびに) 閉じようとしていることです。一般に、close
able オブジェクトは 1 回だけ閉じる必要があり、close
d 以降は使用できなくなるものとみなされます。再利用する必要がある場合は、新しいインスタンスを作成する必要があります。
これはコードの実用的なリビジョンです:
リーリー以上が書き込み/読み取りしようとしたときの io.Pipe とデッドロックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。