ホームページ >バックエンド開発 >Golang >Go で「すべてのゴルーチンがスリープ中 - デッドロック」エラーを解決するにはどうすればよいですか?

Go で「すべてのゴルーチンがスリープ中 - デッドロック」エラーを解決するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-23 10:16:111042ブラウズ

How to Resolve the

Go: 致命的なエラー「すべてのゴルーチンがスリープ状態 - デッドロック」の説明

Go では、バッファリングされていないチャネルへの送信は、受信機が利用可能です。提供されたコードでは、file1chan チャネルへの単語の送信を担当する goroutine が唯一の goroutine であり、レシーバーはありません。その結果、送信者は無期限にブロックされ、デッドロックが発生します。

新しいゴルーチンを使用した解決策:

1 つの解決策は、送信を処理する別のゴルーチンを作成することです。言葉。このゴルーチンはメインのゴルーチンをブロックせず、同時実行を可能にします。

func main() {
    f, _ := os.Open("D:\input1.txt")
    scanner := bufio.NewScanner(f)
    file1chan := make(chan string)
    go func() { // start a new goroutine that sends strings down file1chan 
        for scanner.Scan() {
            line := scanner.Text()

            // Split the line on a space
            parts := strings.Fields(line)

            for i := range parts {
                file1chan <- parts[i]
            }
        }
        close(file1chan)
    }()
    print(file1chan) // read strings from file1chan
}

バッファー付きチャネルを使用した解決策:

別の解決策は、バッファー付きチャネルを作成することです。これにより、複数の値を同時に送受信できるようになります。指定された問題の場合、バッファ サイズは 1 で十分です。

func main() {
    f, _ := os.Open("D:\input1.txt")
    scanner := bufio.NewScanner(f)
    file1chan := make(chan string, 1) // buffer size of one
    for scanner.Scan() {
        line := scanner.Text()

        // Split the line on a space
        parts := strings.Fields(line)

        for i := range parts {
            file1chan <- parts[i]
        }
    }
    close(file1chan) // we're done sending to this channel now, so we close it.
    print(file1chan)
}

以上がGo で「すべてのゴルーチンがスリープ中 - デッドロック」エラーを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。