ゴルーチンの実行順序の予測不可能性
提供されたコード スニペットでは、2 つのゴルーチンの実行順序は非決定的です。出力は、最初のゴルーチンの後に開始されたにもかかわらず、2 番目のゴルーチンが最初に実行されたことを示しています。この動作は、ゴルーチンの同時実行の性質によるものです。つまり、ゴルーチンは互いに独立して実行されます。
ゴルーチンの同期メカニズム
ゴルーチンの実行順序を制御するには、Go が提供する同期メカニズムを使用できます。 as:
Channels: チャネルを使用してゴルーチンの実行を同期できます。チャネルは、ゴルーチンがデータを送受信できるようにする通信チャネルです。以下の変更された例では、最初のゴルーチンが実行を完了してから 2 番目のゴルーチンが開始されるまで、チャネルを使用してメインのゴルーチンがブロックされます。
func main() { c := make(chan int) go sum([]int{1, 2, 3}, c) // Use the channel to block until it receives a send x := <-c fmt.Println(x) // Then execute the next routine go sum([]int{4, 5, 6}, c) x = <-c fmt.Println(x) }
待機グループ: 待機グループこれは、続行する前に複数のゴルーチンの実行が完了するのを待つことを可能にするもう 1 つの同期メカニズムです。次の例では、待機グループを使用して、メインのゴルーチンが終了する前にすべてのゴルーチンが確実に終了するようにしています。
func sum(a []int, c chan int, wg *sync.WaitGroup) { defer wg.Done() fmt.Println("summing: ", a) total := 0 for _, v := range a { total += v } // Send total to c c <- total } func main() { c := make(chan int) wg := new(sync.WaitGroup) // Concurrently call the concurrent calls to sum, allowing execution to continue to the range of the channel go func() { // Increment the wait group, and pass it to the sum func to decrement it when it is complete wg.Add(1) go sum([]int{1, 2, 3}, c, wg) // Wait for the above call to sum to complete wg.Wait() // And repeat... wg.Add(1) go sum([]int{4, 5, 6}, c, wg) wg.Wait() // All calls are complete, close the channel to allow the program to exit cleanly close(c) }() // Range of the channel for theSum := range c { x := theSum fmt.Println(x) } }
これらの同期メカニズムを使用すると、ゴルーチンの実行順序を制御し、必要な操作シーケンスが維持されます。
以上がGo でゴルーチンの実行順序を制御するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。