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 サイトの他の関連記事を参照してください。