>백엔드 개발 >Golang >Golang의 고루틴과 채널의 실행 순서 제어 방법

Golang의 고루틴과 채널의 실행 순서 제어 방법

WBOY
WBOY원래의
2023-08-09 09:06:241413검색

Golang 中 Goroutines 和 Channels 的执行顺序控制方法

Golang에서 고루틴과 채널의 실행 순서 제어 방법

Golang 프로그래밍에서 고루틴과 채널은 매우 중요한 개념입니다. 고루틴은 프로그램 실행 중에 여러 기능을 동시에 실행할 수 있는 경량 스레드입니다. 채널은 고루틴 간의 통신에 사용되는 메커니즘입니다.

어떤 경우에는 프로그램이 예상대로 실행되도록 고루틴과 채널의 실행 순서를 제어해야 합니다. 이 문서에서는 고루틴과 채널의 시퀀스 제어를 구현하는 몇 가지 일반적인 방법을 소개합니다.

방법 1: WaitGroup 사용

WaitGroup은 고루틴 그룹이 끝날 때까지 기다리는 데 사용되는 카운터입니다. 작동 원리는 고루틴이 시작될 때마다 카운터가 1씩 증가하고, 각 고루틴이 실행된 후에는 카운터가 1씩 감소하는 것입니다. 카운터가 0에 도달하면 기본 스레드가 계속 실행됩니다.

다음은 시퀀스 제어를 위해 WaitGroup을 사용하는 샘플 코드입니다:

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup

    wg.Add(2)

    go func() {
        defer wg.Done()
        fmt.Println("Goroutine 1")
    }()

    go func() {
        defer wg.Done()
        fmt.Println("Goroutine 2")
    }()

    wg.Wait()

    fmt.Println("Main Goroutine")
}

이 예에서는 두 개의 고루틴을 만들고 각 고루틴은 메시지를 인쇄합니다. 각 고루틴에서 defer wg.Done() 语句将计数器减一。最后,wg.Wait()를 전달하여 모든 고루틴이 실행될 때까지 메인 스레드를 차단합니다.

위 코드를 실행하면 출력은 다음과 같습니다.

Goroutine 1
Goroutine 2
Main Goroutine

고루틴 1과 고루틴 2의 실행 순서는 불확실하지만 메인 스레드가 "Main Goroutine"을 인쇄하기 전에 완료되어야 함을 알 수 있습니다.

방법 2: 버퍼되지 않은 채널 사용

버퍼되지 않은 채널을 사용하면 다른 고루틴이 채널에서 데이터를 수신할 때까지 고루틴의 실행을 차단할 수 있습니다. 고루틴 종속성 체인을 구축하면 여러 고루틴을 순차적으로 실행할 수 있습니다.

다음은 버퍼링되지 않은 채널을 사용하는 순차 제어를 위한 샘플 코드입니다.

package main

import (
    "fmt"
)

func main() {
    ch1 := make(chan struct{})
    ch2 := make(chan struct{})

    go func() {
        fmt.Println("Goroutine 1")
        ch1 <- struct{}{}
    }()

    go func() {
        <-ch1
        fmt.Println("Goroutine 2")
        ch2 <- struct{}{}
    }()

    <-ch2

    fmt.Println("Main Goroutine")
}

이 예에서 Goroutine 1은 메시지를 인쇄한 후 빈 구조를 ch1 채널로 보냅니다. 다음으로, 고루틴 2는 ch1 채널에서 데이터를 수신한 후 다른 메시지를 인쇄하고 빈 구조를 ch2 채널로 보냅니다. 마지막으로 메인 스레드는 ch2 채널에서 데이터를 수신한 후 "Main Goroutine"을 인쇄합니다.

위 코드를 실행하면 출력은 다음과 같습니다.

Goroutine 1
Goroutine 2
Main Goroutine

고루틴 1과 고루틴 2의 실행 순서가 결정되어 있으며, 메인 스레드가 "Main Goroutine"을 인쇄하기 전에 완료되어야 함을 알 수 있습니다.

방법 3: 버퍼링된 채널 사용

버퍼링된 채널을 사용하면 생성 시 용량을 지정하여 일정량의 데이터를 저장할 수 있습니다. 버퍼 크기를 적절하게 설정함으로써 고루틴의 동시 실행 수를 제어하고 순서 제어를 달성할 수 있습니다.

다음은 버퍼링된 채널을 이용한 순차 제어의 샘플 코드입니다.

package main

import (
    "fmt"
)

func main() {
    ch := make(chan struct{}, 2)

    go func() {
        fmt.Println("Goroutine 1")
        ch <- struct{}{}
    }()

    go func() {
        fmt.Println("Goroutine 2")
        ch <- struct{}{}
    }()

    <-ch
    <-ch

    fmt.Println("Main Goroutine")
}

이 예제에서는 버퍼 용량이 2인 채널 채널을 생성합니다. 각 고루틴에서는 빈 구조를 ch 채널로 보냅니다. 마지막으로, 메인 스레드는 ch 채널로부터 데이터를 두 번 받은 후 "Main Goroutine"을 인쇄합니다.

위 코드를 실행하면 출력은 다음과 같습니다.

Goroutine 1
Goroutine 2
Main Goroutine

고루틴 1과 고루틴 2의 실행 순서가 결정되어 있으며, 메인 스레드가 "Main Goroutine"을 인쇄하기 전에 완료되어야 함을 알 수 있습니다.

위 방법을 통해 고루틴과 채널의 실행 순서를 유연하게 제어할 수 있습니다. 실제 필요에 따라 적절한 방법을 선택하면 프로그램의 동시성과 효율성을 향상시킬 수 있습니다.

요약:

이 글에서는 Golang에서 고루틴과 채널의 실행 순서를 제어하는 ​​세 가지 일반적인 방법인 WaitGroup 사용, 버퍼링되지 않은 채널 사용 및 버퍼링된 채널 사용을 소개합니다. 이러한 방법을 합리적으로 사용함으로써 유연한 동시성 제어가 가능하며 프로그램의 성능과 효율성을 향상시킬 수 있습니다.

위 내용은 Golang의 고루틴과 채널의 실행 순서 제어 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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