Golang 동시 프로그래밍: Go WaitGroup을 사용하여 작업 스케줄러 구현
WaitGroup은 완료되지 않은 작업 수를 기록하기 위해 내부적으로 카운터를 유지 관리합니다. Add 메소드가 호출되면 카운터는 지정된 값만큼 증가하고, Done 메소드가 호출되면 카운터는 1씩 감소합니다. 카운터가 0보다 크면 현재 고루틴은 다음과 같습니다. 카운터가 0으로 돌아갈 때까지 차단됩니다.
package main import ( "fmt" "sync" "time" ) func worker(id int, wg *sync.WaitGroup) { defer wg.Done() fmt.Printf("Worker %d starting ", id) time.Sleep(time.Second) fmt.Printf("Worker %d done ", id) } func main() { var wg sync.WaitGroup for i := 1; i <= 5; i++ { wg.Add(1) go worker(i, &wg) } wg.Wait() fmt.Println("All workers done") }
이 예에서는 for 루프를 사용하여 5개의 작업자 고루틴을 시작하고 wg.Add(1)를 호출하여 숫자를 추가합니다. WaitGroup에 작업을 보냅니다. 작업자 함수에서 defer 키워드를 사용하여 함수가 반환되어 카운터 값을 감소시키기 전에 wg.Done()이 호출되도록 합니다. 마지막으로 wg.Wait()를 사용하여 모든 작업이 완료될 때까지 기다립니다.
Worker 1 starting Worker 2 starting Worker 3 starting Worker 4 starting Worker 5 starting Worker 3 done Worker 1 done Worker 2 done Worker 5 done Worker 4 done All workers done
모든 작업자 고루틴이 동시에 실행되는 것을 볼 수 있지만 출력 순서가 반드시 시작 순서와 일치하지는 않습니다. 스케줄링은 Go 런타임에 의해 수행됩니다.
이 기사의 소개와 샘플 코드를 통해 Golang의 WaitGroup을 사용하여 작업 스케줄러를 구현하는 방법에 대해 더 깊이 이해했다고 믿습니다. 이 기사가 Golang에서 동시 프로그래밍을 배우고 사용하는 데 도움이 되기를 바랍니다.
위 내용은 Golang 동시 프로그래밍: Go WaitGroup을 사용하여 작업 스케줄러 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!