ホームページ >バックエンド開発 >Golang >書き込み/読み取りしようとしたときの io.Pipe とデッドロック

書き込み/読み取りしようとしたときの io.Pipe とデッドロック

王林
王林転載
2024-02-06 09:40:031172ブラウズ

尝试写入/读取时 io.Pipe 和死锁

質問の内容

基盤となるロジックを理解するために何時間も費やしてきましたが、進歩はありませんでした。以下のコードは、最初の反復後にデッドロックを返します。 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 つの問題は、パイプを複数回 (ループ コードが繰り返されるたびに) 閉じようとしていることです。一般に、closeable オブジェクトは 1 回だけ閉じる必要があり、closed 以降は使用できなくなるものとみなされます。再利用する必要がある場合は、新しいインスタンスを作成する必要があります。

これはコードの実用的なリビジョンです:

リーリー

以上が書き込み/読み取りしようとしたときの io.Pipe とデッドロックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。