병렬 연산을 사용해 텍스트에서 문자의 빈도를 세어요.
병렬성이란 순차적으로도 할 수 있는 일을 병렬로 처리하는 것을 말해요. 흔한 예시가 바로 문자의 빈도를 세는 거예요. 병렬성을 활용해 여러 텍스트로 이루어진 목록에서 각 문자의 전체 빈도를 계산해요.
Go는 go 키워드로 시작하는 "고루틴"을 통해 동시성을 지원해요.
동시성을 지원하는 간단하고 가볍고 우아한 방법이며, 이 언어의 가장 큰 강점 중 하나예요.
이 연습 문제의 이름은 Parallel letter frequency지만, Go에서는 "Parallel"이라는 용어를 그리 자주 보지는 못한다는 걸 눈치챘을지도 몰라요. 고퍼들은 여러 독립적인 고루틴(다른 언어의 맥락에서는 "프로세스"나 "스레드")을 관리하는 일을 설명할 때 Concurrent라는 용어를 선호해요. 두 용어는 흔히 뒤섞여 쓰이지만, 고퍼들은 기술적으로 정확한 표현을 좋아하기에 고루틴이 겉보기에 동시에 실행되는 것을 이야기할 때는 "concurrent"를 써요.
프로그램이 병렬로 실행되도록 계획할 수는 있고, 때로는 정말 병렬로 실행되는 것처럼 보이기도 하지만, 코드의 실행 맥락을 정확히 알지 못하는 한 프로세스가 동시에 실행된다는 것만 보장할 수 있어요. 다시 말해, 우리가 구분할 수 없을 만큼 빠르게 순차 실행되고 있을 수는 있지만, 엄밀히 동시에 실행되는 것은 아니에요.
더 알고 싶다면 Go 블로그의 글 동시성은 병렬성이 아니다를 한번 읽어봐요.
Go의 동시성 기능이 처음이라면, 시작하는 데 도움이 될 자료를 몇 가지 소개할게요. 이 연습 문제를 시작하기 전에 한번 훑어보는 걸 추천해요:
아주 깊이 파고들고 싶다면 @kat-co가 쓴 Concurrency in Go 책을 한번 읽어봐요.
이 연습 문제에서는 단위 테스트만으로 동시성 해법을 잘 작성했는지 판단할 수 없어요.
대신 이 연습 문제를 로컬에서 풀고 go test -bench .로 벤치마크를 실행하는 게 가장 좋아요.
좋은 해법이라면 동시성 버전이 순차 버전보다 작업당 나노초 수치(ns/op)가 더 낮게 나오는 것을 확인할 수 있을 거예요.
Exercism에 가입하고 Go 트랙을 개념 34개연습 문제 165개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.
동시성과 병렬성의 차이를 살펴보고, JavaScript, Go, Elixir, Rust 같은 언어들이 택한 여러 접근법을 함께 봐요.