WaitGroup을 사용하는 방법
1) sync.WaitGroup을 사용하여 대기
2) go func 사용하여 goroutine 함수 호출
위 2가지 방법을 사용하면 여러번 실행된 결과값을 병렬 처리한 뒤 한개의 결과값으로 추출할 수 있습니다. 예제 코드는 다음과 같습니다.
package main
import (
"fmt"
"math/rand"
"strconv"
"sync"
"time"
)
func main() {
result := 0
count := 10
var wg sync.WaitGroup // WaitGroup 선언
wg.Add(count) // Wait 개수 지정
for i := 1; i <= count; i++ {
go func(goroutineNumber int) {
defer wg.Done() // function이 종료될 때 Done() 호출로 1 감소
time.Sleep(time.Duration(rand.Intn(3)) * time.Second)
result++
fmt.Println(strconv.Itoa(goroutineNumber) + " is done") // goroutine 번호
}(i)
}
wg.Wait()
fmt.Print("result:" + strconv.Itoa(result)) // result는 1씩 증가 x 10번
}
결과는 다음과 같습니다.
3 is done
5 is done
1 is done
4 is done
7 is done
8 is done
6 is done
2 is done
9 is done
10 is done
result:10
channel을 사용하는 방법
package main
import (
"fmt"
"time"
)
func worker(id int, c chan int) {
// 각 함수에서 실행할 작업
time.Sleep(time.Second)
result := id + 1
// 결과값을 채널에 보내기
c <- result
}
func main() {
// 결과값을 저장할 채널 생성
c := make(chan int)
// 3번의 함수 실행
for i := 0; i < 3; i++ {
go worker(i, c)
}
// 채널을 통해 결과값 수집
var results []int
for i := 0; i < 3; i++ {
result := <-c
results = append(results, result)
}
// 결과값 출력
fmt.Println(results)
}
worker() 함수를 3번 실행시키고, 각 함수에서 반환된 값을 채널 c를 통해 수집. worker() 함수에서는 각각 다른 id 값을 받아와서 1을 더한 값을 결과값으로 반환. 이렇게 반환된 결과값은 c 채널에 보내지고, main() 함수에서는 채널을 통해 모든 결과값을 수집합니다. 마지막으로 수집된 결과값들을 출력합니다.
반응형
'Programming Language > golang' 카테고리의 다른 글
map[string]interface 데이터를 avro 포맷으로 파일 저장하는 방법 (0) | 2023.11.28 |
---|---|
golang struct type을 JSON으로 Print 하기 (0) | 2023.03.29 |
golang prviate repository에서 디펜던시 가져오는 방법 (0) | 2023.03.06 |
go gin framework graceful shutdown 예제 (0) | 2023.03.03 |
intellij에서 golang 프로젝트 인식이 잘 안될때 (0) | 2023.02.22 |
golang 동시성 예제 (0) | 2021.03.22 |