-
[ Golang ] Go 루틴 최대갯수를 제한하기개발/golang 2021. 4. 2. 00:11
DB 배치 작업을 하거나 외부 API 를 사용할때 커넥션 갯수가 너무 많아지는것이 부담스러울때 고루틴을 다음과 같이 제한 가능하다.
package example_limit_gorutine import ( "fmt" "log" "sync" "time" ) func SelectTable(offset int) { time.Sleep(300 * time.Millisecond) log.Println(fmt.Sprintf("select * from table limit %d,10", offset)) } func Run(concurrentCount int, totalCount int) { concurrentGoroutines := make(chan struct{}, concurrentCount) var wg sync.WaitGroup for offset := 0; offset < totalCount; offset += 10 { wg.Add(1) go func(i int) { defer wg.Done() concurrentGoroutines <- struct{}{} SelectTable(i) <-concurrentGoroutines }(offset) } wg.Wait() } package example_limit_gorutine_test import ( "github.com/hoyeonUM/golang-example/example_limit_gorutine" "github.com/stretchr/testify/assert" "testing" "time" ) func TestConcurrent(t *testing.T) { t.Run("given concurrent count 10 and total count 100 when increase number 10 and wait time is 300ms then over execute time ge 1500ms", func(t *testing.T) { startTime := time.Now() example_limit_gorutine.Run(2, 100) endTime := time.Now() assert.GreaterOrEqual(t, endTime.Sub(startTime).Milliseconds(), int64(1500)) }) }
참고자료
gist.github.com/AntoineAugusti/80e99edfe205baf7a094
'개발 > golang' 카테고리의 다른 글
[ Golang ] Rest Api 스펙이 틀릴때 (타입이 틀릴때) Json decode(Unmarshal) 하기 (0) 2021.04.02 [ Golang ] JSON Object 키 넣은 순서대로 정렬하기 (0) 2021.04.02 mariadb 에서 elasticsearch 실시간 연동하기 (0) 2021.03.30 [ Golang ] Go 루틴을 테스트 하기 (gomock) (0) 2021.03.11