Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- http
- package
- Sync
- json
- bitcoin
- Callback
- mutex
- JavaScript
- Linux
- Python
- write
- FOR
- C
- go
- Golang
- go언어
- install
- windows
- channel
- 영화
- 리뷰
- window
- c++
- API
- GO 언어
- range
- tcp
- File
- 책
- Close
Archives
- Today
- Total
Code Habit
Go ) WaitGroup 본문
go 언어는 sync패키지의 WaitGroup을 통해 대기 그룹을 제공한다. 대기 그룹은 고루틴이 끝날때까지 대기한다.
sync 패키지에서 제공하는 대기 그룹의 구조체와 함수는 다음과 같다.
- sync.WaitGroup
- func (wg *WaitGroup) Add(delta int) : 대기 그룹에 고루틴 개수 추가
- func (wg *WaitGroup) Done(): 고루틴이 끝났다는 것을 알려줄 때 사용
- func (wg *WaitGroup) Wait(): 모든 고루틴이 끝날 때까지 기다림
package main
import {
"fmt"
"runtime"
"sync"
}
func main() {
runtime.GOMAXPROCS(runtime.NumCPU()) // 모든 CPU 사용
wg := new(sync.WaitGroup) // 대기 그룹 생성
for i := 0; i < 10; i++ {
wg.Add(1) // 반복할 때마다 wg.Add 함수로 1씩 추가
go func()(n int) { // 고루틴 10개 생성
fmt.Println(n)
wg.Done() // 고루틴이 끝났다는 갓을 알려줌
}(i)
}
wg.Wait() // 모든 고루틴이 끝날 때까지 기다림
fmt.Println("the end")
}
|
대기 그룹은 sync.WaitGroup을 할당한 뒤에 Add, Done, Wait 함수로 사용한다. 고루틴을 생성할 때 Add 함수로 고루틴 개수를 추가해준다. 그리고 고루틴 안에서 Done 함수를 사용하여 고루틴이 끝났다는 것을 알려준다. 마지막으로 Wait 함수를 사용하여 모든 고루틴이 끝날 때까지 기다린다.
Add 함수에 설정한 값과 Done 함수가 호출되는 횟수는 같아야 한다. 즉 Add(3) 으로 설정했다면 Done 함수는 3번 호출되어야 한다. 이 횟수가 맞지 않으면 패닉이 발생하므로 주의한다.
Done 함수는 defer와 함께 사용하여 지연 호출로도 사용할 수 있다.
for i := 0; i < 10; i++ {
wg.Add(1)
go func(n int) {
defer wg.Done() // 고루틴이 끝나기 직전에 wg.Done 함수
fmt.Println(n)
}(i)
}
|