고루틴 실행 순서 예측 불가능성
제공된 코드 조각에서 두 고루틴의 실행 순서는 비결정적입니다. 출력에는 두 번째 고루틴이 첫 번째 고루틴 이후에 시작되었음에도 불구하고 먼저 실행되는 것으로 표시됩니다. 이 동작은 고루틴의 동시 특성으로 인해 발생하며, 이는 고루틴이 서로 독립적으로 실행된다는 것을 의미합니다.
고루틴의 동기화 메커니즘
고루틴 실행 순서를 제어하려면 , Go에서 제공하는 동기화 메커니즘을 사용할 수 있습니다. as:
채널: 채널을 사용하여 고루틴 실행을 동기화할 수 있습니다. 채널은 고루틴이 데이터를 보내고 받을 수 있는 통신 채널입니다. 아래 수정된 예에서 채널은 두 번째 고루틴이 시작되기 전에 첫 번째 고루틴이 실행을 완료할 때까지 기본 고루틴을 차단하는 데 사용됩니다.
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) }
대기 그룹: 대기 그룹 진행하기 전에 여러 고루틴이 실행을 완료할 때까지 기다릴 수 있는 또 다른 동기화 메커니즘입니다. 다음 예에서는 대기 그룹을 사용하여 기본 고루틴이 종료되기 전에 모든 고루틴이 완료되었는지 확인합니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!