본문으로 바로가기
COMMUNITY모든 이야기

Go 채널 range 루프 내에서 waitgroup.Done() 호출 시 데드락 발생

빗방울 2026.10.30 09:51 1분 읽기 조회 12 · 추천 1

자동화 스크립트에서 워커 풀 패턴으로 데이터를 처리하고 있습니다. 모든 작업 완료 후 채널을 닫고 종료하려는데 데드락이 발생합니다.

코드:

package main

import "sync"

func main() {
	ch := make(chan int, 10)
	var wg sync.WaitGroup

	for i := 0; i < 5; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			for n := range ch {
				_ = n
			}
		}()
	}

	for i := 0; i < 10; i++ {
		ch <- i
	}
	close(ch)
	wg.Wait()
}

오류: fatal error: all goroutines are asleep - deadlock!

시도: 채널 버퍼 크기 조정, close(ch) 위치 변경.

질문: 위 코드 구조에서 워커들이 range 루프를 정상적으로 빠져나와 wg.Done()까지 도달하지 못하는 이유가 무엇입니까?

모든 이야기1478

가벼운 안부부터 깊은 생각까지, 함께 나눠요.

글쓰기
총 1478개의 이야기
댓글