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