Programming Language/golang
goroutine 함수 여러번 실행 결과값 기다리는 2가지 방법 - js callback 처럼
AndersonChoi
2023. 3. 3. 16:22
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() 함수에서는 채널을 통해 모든 결과값을 수집합니다. 마지막으로 수집된 결과값들을 출력합니다.
반응형