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

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

王林
リリース: 2024-02-06 09:40:03
転載
1180 人が閲覧しました

尝试写入/读取时 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 までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート