Go 루틴 실행 순서
이 코드는 두 개의 동시 "go" 루틴 또는 고루틴이 있는 Go 루틴 실행 순서의 개념을 보여줍니다. 는 동시에 실행되지만 순서는 보장되지 않습니다.
코드는 정수 배열을 사용하는 합계 함수를 정의합니다. 채널을 입력으로 사용합니다. 이 함수는 배열에 있는 정수의 합을 계산하고 그 결과를 제공된 채널로 보냅니다.
메인 함수에서는 고루틴 간의 통신을 용이하게 하기 위해 채널 c가 생성됩니다. 두 개의 고루틴이 시작되고, 각각은 서로 다른 입력 배열로 sum 함수를 실행하고 그 결과를 c로 보냅니다.
그런 다음 프로그램은 채널 c에서 고루틴이 보낸 값을 받아 인쇄합니다. 그러나 고루틴이 완료되는 순서는 비결정적이므로 출력 순서가 다를 수 있습니다.
고루틴의 실행 순서를 제어하려면 표준에서 제공하는 차단 채널이나 동기화 프리미티브와 같은 다양한 메커니즘을 사용할 수 있습니다. 도서관. 다음은 몇 가지 예입니다.
1. 채널 차단:
이 수정된 버전에서는 채널에서 값이 수신될 때까지 메인 루틴을 차단하여 고루틴이 순차적으로 실행됩니다:
func main() { c := make(chan int) go sum([]int{1, 2, 3}, c) // Block until a value is received from c x := <-c fmt.Println(x) go sum([]int{4, 5, 6}, c) // Block until a value is received from c x = <-c fmt.Println(x) }
2. 채널이 있는 대기 그룹:
또 다른 옵션은 채널에 대한 대기 그룹과 범위를 사용하여 결과를 처리하기 전에 모든 고루틴이 실행을 완료했는지 확인하는 것입니다.
func main() { c := make(chan int) wg := new(sync.WaitGroup) wg.Add(1) go sum([]int{1, 2, 3}, c, wg) wg.Wait() wg.Add(1) go sum([]int{4, 5, 6}, c, wg) wg.Wait() close(c) for x := range c { fmt.Println(x) } }
이러한 기술을 사용하면 동시 프로그램에서 원하는 동작을 달성하기 위해 고루틴의 실행 순서를 제어할 수 있습니다.
위 내용은 Go 루틴의 실행 순서를 어떻게 제어할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!