Go 동시성 완벽 정리: 고루틴부터 뮤텍스까지
원제 Go Concurrency Distilled
144 포인트댓글 42

Key Point
Go 동시성의 핵심 패턴과 함정을 한 곳에서 실행 가능한 예제로 배울 수 있으며, 특히 레이스 컨디션과 데이터 레이스의 차이, 뮤텍스와 채널의 선택 기준을 명확히 한다.
핵심 요약
- Go의 동시성 개념을 다루는 미니북으로, 고루틴, 채널, 셀렉트, 파이프라인, 타이머, 컨텍스트 등 19개 주제를 대화형 예제와 함께 설명한다.
- 고루틴은 go 키워드로 시작되는 경량 함수로, OS 스레드보다 수백~수천 개를 생성할 수 있으며, sync.WaitGroup을 통해 완료를 기다린다.
- 채널은 고루틴 간 값 전달의 핵심으로, 송신은 동기식이며 버퍼 크기, 방향 지정(송신 전용, 수신 전용), range 반복을 지원한다.
- 셀렉트 문은 여러 채널 중 준비된 케이스를 무작위로 선택하거나 기본값을 실행하여 파이프라인의 데이터 흐름을 제어한다.
- 파이프라인은 리더-프로세서-라이터 구조로 데이터를 처리하며, 출력 채널, 완료 신호, 취소 채널로 단계 간 통신한다.
- 에러 처리는 첫 에러 반환, 결과 타입 포함, 별도 에러 채널 수집 세 가지 방식을 제공한다.
- time.After()는 타임아웃용 채널을, time.Timer는 예약 실행용 타이머를, time.Ticker는 주기 작업용 반복 타이머를 제공한다.
- 컨텍스트는 context.WithCancel, WithTimeout, WithDeadline으로 작업 취소를 관리하며, 계층적이고 불변이고 단축 타임아웃이 우선한다.
- 데이터 레이스는 여러 고루틴이 공유 데이터에 동시 접근할 때 발생하며, -race 플래그로 감지하고 채널이나 뮤텍스로 방지한다.
- 레이스 컨디션은 작업 순서 불확실성으로 인한 상태 오류로, 개별 연산이 안전해도 발생하므로 뮤텍스로 복합 연산을 보호해야 한다.
- sync.Mutex는 Lock/Unlock으로 배타적 접근을 보장하고, TryLock은 차단 대신 false를 반환하며, sync.RWMutex는 RLock/RUnlock으로 읽기 동시성을 허용한다.
- 세마포, 한 번 실행, 객체 풀, 원자 연산, 테스트, 스케줄링, 진단 등 추가 주제를 다루며 AI 없이 작성되었다.