Go 동시성 핵심 정리

55 minutes ago 1

Go 동시성을 빠르게 복습하는 미니북으로, 고루틴과 채널부터 동기화, 테스트, 운영 진단까지 코드 수정과 실행이 가능한 예제로 정리함 채널과 select 로 데이터 전달, 완료 알림, 취소, 파이프라인을 구성하고, 타이머와 context로 시간 제한과 작업 취소를 다룸 데이터 경쟁과 경쟁 조건은 서로 다름: 개별 연산이 동시성 안전해도 실행 순서에 따라 잘못된 상태가 생길 수 있으며, Go 경쟁 탐지기는 이런 경쟁 조건까지 찾아내지는 못함 동기화 도구는 목적에 맞게 선택해야 함: WaitGroup은 완료 대기, 뮤텍스는 공유 데이터와 복합 연산 보호, Once는 한 번 실행, Pool은 메모리 재사용을 담당함 synctest와 런타임 진단 도구로 동시성 코드의 상태와 시간 의존 동작을 테스트하고, 메트릭/프로파일링/실행 추적으로 운영 환경의 문제를 분석할 수 있음 빠른 복습을 위한 대화형 미니북 입문서가 아닌 복습용 자료로, 각 주제의 코드를 바꾸고 Run을 눌러 실험할 수 있음 정적 예제를 담은 PDF 버전도 제공하며, AI를 사용하지 않고 제작한 책임 기초부터 실습하며 배우려는 독자에게는 Gist of Go: Concurrency를 안내함 고루틴과 실행 완료 대기 고루틴(goroutine) 은 go 키워드로 시작하는 함수이며, Go 런타임이 CPU 코어에서 실행되는 운영체제 스레드에 배분함 운영체제 스레드보다 가벼워 수백 개나 수천 개를 만들 수 있음 각 고루틴은 독립적이며, 프로그램 시작 시 암묵적으로 실행되는 main도 고루틴임 main이 끝나면 다른 고루틴도 종료됨 sync.WaitGroup 은 내부 카운터로 완료를 기다림 Add(n)은 카운터를 n만큼 늘리고, Done()은 1만큼 줄임 Wait()는 카운터가 0이 될 때까지 호출한 고루틴을 차단함 WaitGroup.Go는 카운터 증가, 고루틴 실행, 종료 시 카운터 감소를 한 번에 처리함 WaitGroup은 고루틴 자체를 추적하지 않으며, 모든 메서드를 여러 고루틴에서 안전하게 호출할 수 있음 일반적으로 Add를 모두 호출한 뒤 Wait를 호출하지만, 일부 Add를 다른 고루틴에서 Wait 이후 호출하는 구성도 가능함 여러 고루틴이 Wait를 호출하면 모두 카운터가 0이 될 때까지 기다림 채널의 전달, 종료, 방향과 버퍼 채널(channel) 은 고루틴 사이에서 값을 전달함 버퍼 없는 채널의 송신 ch <- val은 다른 고루틴이 <-ch...

Read Entire Article