Go 동시성 19개 주제를 압축한 미니북 'Go Concurrency Distilled' 공개, 브라우저에서 코드를 고쳐 바로 실행하는 예제 제공
- Anton Zhiyanov의 Go Concurrency Distilled는 고루틴, 채널, 셀렉트, 파이프라인, 컨텍스트, 뮤텍스, 세마포어, 아토믹, 스케줄링, 진단 등 19개 장으로 Go 동시성을 요약한 미니북임
- 각 장의 예제는 코드를 수정해 Run을 눌러 실행하는 인터랙티브 형태이고, 정적 예제 PDF는 GitHub의 nalgeon/go-conc-distilled 저장고에서 내려받을 수 있음
- 책은 입문서가 아닌 복습용 요약서로 성격을 못박고, 바닥부터 학습하려는 독자에게 저자의 책 Gist of Go: Concurrency를 권함
sync.WaitGroup의 카운터 동작(Add, Done, Wait)과 함께 새 헬퍼 WaitGroup.Go를 다룸: 카운터를 1 올리고 지정 함수를 고루틴으로 돌린 뒤 끝나면 다시 내림- 채널 송신은 동기 연산이라 보내는 쪽이 상대가 값을 받을 때까지 블록되고,
close()와comma ok값으로 종료를 알리며, 이중 close나 닫힌 채널에 쓰기는 panic을 유발함
Hacker News opinions
Go 동시성은 진짜 마법 같아. 나 고루틴 중독자인데 재활 따위 안 받는다. 수년간 봐온 바로는 이렇게 일이 어떤 스레드에서든 벌어질 수 있는 언어가 또 없더라.
단점을 물어본다면, 난 하스켈 먼저 배운 입장에서 Go 동시성이 확실히 다운그레이드라고 느낀다. 채널이나 셀렉트는 STM으로 구현할 수 있어서 stdlib에 있을 필요도 없고, 채널을 두 번 닫으면 어떻게 되나 같은 뜨거운 선택도 너가 직접 정할 수 있지. STM에서 뮤텍스 관리로 가는 건 추상화 수준이 확 떨어진다.
그 '어떤 스레드에서든 일이 벌어질 수 있다'는 부분, 그린 스레드 방식 동시성 구현치고는 다 해당되는 거 아니냐?
Erlang도 좀 봐줘. BEAM 위의 Erlang/Elixir로 WhatsApp이 10억 명을 감당했고 RabbitMQ가 Erlang이라 Reddit이 쓰고, Discord는 Elixir 쓴다. 에릭슨 AXD301 ATM 스위치는 2002년에 9개월간 nine nines, 즉 다운타임 24밀리초를 찍었다는 얘기인데 이쪽 역사가 진짜 흥미로움.
Go 동시성은 겉보기엔 단순한데 하면 안 되는 패턴을 읽는 게 학습에 오히려 더 도움이 된다. 데이터 레이스 패턴은 우버 블로그 글이 최고던데:
Go 동시성은 간단해 보여도 막상 select와 에러 처리를 제대로 잡으려면 연습이 필요하다. 이런 주제를 한 번에 압축 정리해 줘서 괜찮네.