개발 지식

개발 지식

Go 고루틴(Goroutine)을 남용하면 오히려 병목이 생긴다

페이지 정보

profile_image
영삼이
0건 125회 25-03-28 15:05

본문

✅ 고루틴(Goroutine)을 남용하면 오히려 병목이 생긴다

동시성의 함정, 많다고 빠른 게 아니다

Go는 고루틴이 가볍다고 알려져 있다:

go doSomething()

그래서 초보든 고수든 일단 "병렬화 해야지!" 하며 막 던진다.
하지만 고루틴이 많다고 항상 성능이 좋아지진 않는다.


❌ 문제 상황

for _, url := range urls {
    go fetchURL(url)
}
  • 고루틴 수만큼 네트워크 요청 시도

  • CPU보다 많으면 컨텍스트 스위칭 증가

  • 채널 없으면 제어 불가

  • 실제 처리 완료 시점 모호


✅ 해결: 고루틴 풀 또는 세마포어 사용

sem := make(chan struct{}, 5) // 최대 5개 동시 실행

for _, url := range urls {
    sem <- struct{}{} // 점유
    go func(u string) {
        defer func() { <-sem }() // 해제
        fetchURL(u)
    }(url)
}

  • 제한된 수의 고루틴만 실행됨

  • 리소스 사용량 제어 가능

  • 실제 서비스에서는 무조건 제한이 필요함


✔️ 고루틴은 가볍지만 무한정 가볍진 않다.
통제되지 않은 동시성은 병목과 지연의 원인이 된다.

댓글목록

등록된 댓글이 없습니다.