Go 同時実行性: for ループ内の匿名関数の驚くべき動作を探索する
この探索では、予期せぬ動作を明らかにします。 for ループと匿名を使用する場合に Go 同時実行によって示される動作function.
問題:
sync.WaitGroup を使用して同時実行性をテストするために次のコード スニペットを実行すると想像してください:
func main() { var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) go func() { fmt.Println(i) time.Sleep(time.Second * 1) wg.Done() }() } wg.Wait() }
驚くべきことに、出力が観察されました。予想されたシーケンス 1 ではなく、6、6、6、6、6 でした。 2、3、4、5.
説明:
この動作を理解するには、Go FAQ の「ゴルーチンとして実行されるクロージャーはどうなりますか?」を参照してください。 。このシナリオでは、for ループが完了するまでゴルーチンはスケジュールされませんでした。その結果、その時点で i は 6 に進みました。ゴルーチンが実行されると、すべてのゴルーチンはキャプチャされた i の値 (6 でした) を出力しました。
i を引数として匿名関数に渡すと、実質的に次のコピーが作成されました。現在の値。呼び出し時の値をキャプチャします。これは、コードの修正バージョンで観察される予期される動作を説明しています。
以上がGo 同時実行コードが 1 ~ 5 ではなく 6 を 6 回出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。