Go의 select 구조 활용 가이드
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
Go 언어로 동시성 프로그래밍을 구현하는 개발자 (중급~고급)
핵심 요약
select
구문은 여러 채널(channel)의 입출력을 비동기적으로 처리하는 핵심 동시성 패턴default
절을 사용해 블록킹을 방지하고 타임아웃(time.After
)을 통해 비동기 제어 가능- 채널 상태 확인과 랜덤한 케이스 선택 특성으로 데드락 방지가 필수적
섹션별 세부 요약
1. `select` 기본 구조
select
는switch
와 유사하지만 채널 연산만 지원case
절로 채널 읽기/쓰기,default
으로 블록킹 방지- 예:
case <-ch1:
또는case ch2 <- value:
2. 동시성 처리 예제
- 여러 채널에서 데이터를 비동기적으로 수신하는 예제
ch1
과ch2
에서 데이터가 도착하는 순서에 따라 랜덤하게 실행- 코드:
select {
case msg1 := <-ch1: fmt.Println("Received from ch1:", msg1)
case msg2 := <-ch2: fmt.Println("Received from ch2:", msg2)
}```
###3. `default` 절 활용
* 채널이 준비되지 않았을 때 즉시 실행 (블록킹 방지)
* 예: `select { case msg := <-ch: ... default: fmt.Println("No data") }`
###4. 타임아웃 처리
* `time.After`와 결합해 비동기 타임아웃 제어
* 예:
select {
case msg := <-ch: fmt.Println(msg)
case <-time.After(1 * time.Second): fmt.Println("timeout")}```
5. 데드락 위험 점
select
에default
없이 모든 채널이 준비되지 않으면 데드락 발생- 예:
select {}
는 영원히 블록킹 상태
결론
- 채널 연산이 필요한 동시성 로직은
select
로 구현 - 타임아웃 처리는
time.After
와 결합 - 채널 상태를 항상 모니터링하여 데드락 방지