>백엔드 개발 >Golang >Go 루틴의 실행 순서를 어떻게 제어할 수 있나요?

Go 루틴의 실행 순서를 어떻게 제어할 수 있나요?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-13 21:59:31245검색

How Can I Control the Execution Order of Go Routines?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.