개발 지식

개발 지식

Go 채널(channel)이 무조건 안전하진 않다

페이지 정보

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

본문

✅ 채널(channel)이 무조건 안전하진 않다

동기화 도구지만, 잘못 쓰면 데드락

Go에서 채널은 고루틴 간 통신에 많이 쓰인다:

ch := make(chan int)
go func() {
	ch <- 1
}()
fmt.Println(<-ch)

간단한 예제에선 잘 동작하지만,
실전에서는 채널 사용이 꼬이기 쉽다.


❌ 문제 상황: 송신만 하고 수신 없음

ch := make(chan int)
ch <- 1 // 여기서 영원히 블로킹
  • 버퍼 없는 채널은 수신자가 없으면 영원히 대기

  • 실수로 블로킹 상태 진입 → 데드락 발생


✅ 해결 방법 1: 버퍼 채널 사용

ch := make(chan int, 1)
ch <- 1 // OK
  • 버퍼가 있으면 수신자 없어도 일시적 저장 가능


✅ 해결 방법 2: select + default로 비동기 처리

select {
case ch <- 1:
	// 전송 성공
default:
	// 채널이 가득 차면 무시
}

✔️ 채널은 안전한 듯 보이지만,
동기화/타이밍에 따라 예측 불가한 문제가 생긴다.
의도적으로 통제하며 사용해야 고수가 된다.

댓글목록

등록된 댓글이 없습니다.