Go のデッドロック: "throw: すべてのゴルーチンがスリープ状態です"
Go プログラムでは、2 つ以上のゴルーチンが待機しているときにデッドロックが発生しますお互いが終了するのを待って、結果的に先に進むことができないフリーズ状態になります。この問題は、「スロー: すべてのゴルーチンがスリープ中 - デッドロック!」として報告されることがよくあります
このデッドロックが発生する理由を理解するために、簡略化された Go プログラムを分析してみましょう:
package main import ( "fmt" ) func total(ch chan int) { res := 0 for iter := range ch { res += iter } ch <- res } func main() { ch := make(chan int) go total(ch) ch <- 1 ch <- 2 ch <- 3 fmt.Println("Total is ", <-ch) }
このプログラムでは、 total 関数は、ch チャネル経由で送信された数値の合計を計算し、結果を同じチャネルに送り返します。デッドロックは、次の条件が満たされるために発生します:
からの結果を待っています。これにより、両方のゴルーチン (実行中の合計とmain) は他のゴルーチンが動作するのを待っているため、「スロー: すべてのゴルーチンがスリープ状態です」エラーが発生します。
これを解決するにはデッドロックが発生した場合は、最後の値を送信した後に main 関数で ch チャネルを閉じることができます。
ch <- 3 close(ch)
チャネルを閉じると、入力がもうないという信号が合計 goroutine に送信され、計算を完了して送信できるようになります。結果はchに返されます
以上がGo デッドロック: なぜ「スロー: すべてのゴルーチンがスリープ状態になっている」が発生するのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。