>  기사  >  백엔드 개발  >  Golang 및 Go WaitGroup의 동시성 제어

Golang 및 Go WaitGroup의 동시성 제어

WBOY
WBOY원래의
2023-09-29 20:15:46613검색

Golang中的并发控制和Go WaitGroup

Golang의 동시성 제어 및 Go WaitGroup

Golang에서는 goroutine을 사용하여 동시 실행 작업을 구현할 수 있습니다. 그러나 어떤 경우에는 과도한 리소스 소비나 동시성 경합 문제를 피하기 위해 동시 실행 수를 제어해야 합니다. Golang은 동시성 제어를 달성하기 위한 몇 가지 방법을 제공하며, 그 중 가장 일반적으로 사용되는 방법은 Go WaitGroup을 사용하는 것입니다.

Go WaitGroup은 고루틴 그룹이 실행을 완료할 때까지 기다리는 데 사용되는 계산 세마포입니다. 고루틴 그룹을 시작할 때 WaitGroup을 사용하여 이러한 고루틴의 상태를 추적하고 모든 고루틴이 완료된 후 다음 단계를 수행할 수 있습니다.

아래에서는 Golang의 동시성 제어와 Go WaitGroup의 사용을 보여주기 위해 특정 코드 예제를 사용합니다.

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    numWorkers := 5
    var wg sync.WaitGroup

    for i := 0; i < numWorkers; i++ {
        wg.Add(1) // 每启动一个goroutine,等待组加1
        go worker(i, &wg)
    }

    wg.Wait() // 等待所有goroutine完成

    fmt.Println("All workers have finished")
}

func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done() // goroutine执行完毕,等待组减1
    
    fmt.Printf("Worker %d started
", id)
    time.Sleep(time.Second) // 模拟耗时操作
    fmt.Printf("Worker %d finished
", id)
}

이 예에는 5개의 고루틴이 있으며 각 실행의 작업은 작업자 함수를 호출하는 것입니다. 먼저 WaitGroup 변수 wg를 정의하고 기본 함수에서 5개의 고루틴을 시작했습니다. 각 고루틴은 작업자 함수를 호출하고 wg에 포인터를 전달하여 WaitGroup을 작동합니다.

작업자 함수에서는 defer wg.Done()을 사용하여 고루틴 실행이 완료된 후 대기 그룹의 수를 줄입니다. 이는 각 고루틴이 완료되면 WaitGroup에 알리기 위해 Done() 함수를 호출한다는 것을 의미합니다. 그런 다음, 동시 실행의 효과를 관찰하기 위해 각 작업자 함수에 시간이 많이 걸리는 몇 가지 시뮬레이션된 작업을 추가했습니다.

메인 함수에서는 wg.Wait()를 호출하여 모든 고루틴이 완료될 때까지 기다립니다. 이로 인해 모든 고루틴의 실행이 완료된 후 WaitGroup 수가 0에 도달할 때까지 주 함수가 차단됩니다.

위 코드를 실행하면 다음과 유사한 출력이 표시됩니다.

Worker 0 started
Worker 1 started
Worker 2 started
Worker 3 started
Worker 4 started
Worker 3 finished
Worker 2 finished
Worker 0 finished
Worker 1 finished
Worker 4 finished
All workers have finished

출력에서 ​​볼 수 있듯이 모든 고루틴은 동시에 시작 및 실행되며 완료 후 기본 기능에 알립니다.

Go WaitGroup을 사용하면 동시 실행 수를 쉽게 제어하고 모든 고루틴이 완료된 후 후속 작업을 수행할 수 있습니다. 이는 대규모 동시 작업을 처리하거나 리소스 소비를 제한하는 데 매우 유용합니다.

요약하자면 Golang의 동시성 제어와 Go WaitGroup은 동시 프로그래밍을 구현하는 데 중요한 도구입니다. 동시 작업의 정확성과 안정성을 보장하기 위해 WaitGroup을 사용하여 고루틴 그룹의 실행을 추적하고 제어할 수 있습니다. 이러한 방식으로 멀티 코어 프로세서와 리소스를 더 잘 활용하고 프로그램 실행 효율성을 향상시킬 수 있습니다.

위 내용은 Golang 및 Go WaitGroup의 동시성 제어의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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