본문 바로가기

Programming Language/golang

goroutine 함수 여러번 실행 결과값 기다리는 2가지 방법 - js callback 처럼

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() 함수에서는 채널을 통해 모든 결과값을 수집합니다. 마지막으로 수집된 결과값들을 출력합니다.

반응형