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

영삼이
본문
✅ 고루틴(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)
}
-
제한된 수의 고루틴만 실행됨
-
리소스 사용량 제어 가능
-
실제 서비스에서는 무조건 제한이 필요함
✔️ 고루틴은 가볍지만 무한정 가볍진 않다.
통제되지 않은 동시성은 병목과 지연의 원인이 된다.
- 이전글defer는 편하지만 남발하면 성능이 떨어진다 25.03.28
댓글목록
등록된 댓글이 없습니다.