피드로 돌아가기
Concurrency ใน Go ตอนที่ 2: Channel
Dev.toDev.to
Backend

CSP 기반 Channel 설계를 통한 Goroutine 간 상태 공유 없는 안전한 통신 구현

Concurrency ใน Go ตอนที่ 2: Channel

Perajit2026년 5월 1일4intermediate

Context

공유 메모리 접근 시 발생하는 데이터 경합(Race Condition)과 Lock 오버헤드 해결을 위한 대안 필요. 메모리 공유를 통한 통신 대신 통신을 통한 메모리 공유라는 CSP(Communicating Sequential Processes) 모델의 적용 배경.

Technical Solution

  • Typed Channel 도입을 통한 Goroutine 간 명시적 데이터 송수신 구조 설계
  • Channel의 내장 Blocking 메커니즘을 활용한 WaitGroup 대체 및 동기화 제어
  • Buffered Channel 적용으로 Producer와 Consumer 간 처리 속도 차이에 따른 임시 버퍼링 제공 및 처리량 최적화
  • Channel Direction(send-only, receive-only) 제약을 통한 API 수준의 타입 안전성 및 책임 분리
  • Select Statement를 활용한 다중 Channel 이벤트 핸들링 및 Timeout 기반의 비정상 지연 방지 로직 구현
  • close() 함수를 송신 측에서 호출하여 수신 측의 range 루프 종료를 유도하는 리소스 해제 프로세스 수립

- 공유 변수 대신 Channel을 통한 데이터 전달로 Deadlock 위험 제거 - Producer-Consumer 속도 불균형 해소를 위해 적절한 Capacity의 Buffered Channel 검토 - 무한 대기 방지를 위해 select 문 내 time.After를 이용한 Timeout 처리 적용 - Panic 방지를 위해 Channel close 작업은 반드시 송신 측에서 수행

원문 읽기