고루틴·채널·뮤텍스 비교 실험 경험 + 동시성 버그 재현 어려움 설명
사이드 프로젝트에서 Golang으로 URL 배치 크롤러를 만들며 고루틴을 처음 깊이 써봤습니다. 수백 개의 URL을 순차 처리하면 너무 느려서, 고루틴과 WaitGroup으로 동시 처리 수를 제어하는 구조를 만들었습니다. 처음엔 고루틴을 무제한으로 띄웠다가 메모리가 급증하는 문제가 생겼고, channel을 세마포어로 활용해 동시 실행 수를 20개로 제한했습니다. 결과 수집은 뮤텍스로 보호한 슬라이스에 쓰는 방식과 결과 채널로 받는 방식을 비교해봤는데, 채널 방식이 경쟁 조건 위험이 적고 코드도 더 직관적이었습니다. Go의 동시성 모델이 다른 언어와 다른 점은 스레드 대신 고루틴이라 생성 비용이 낮다는 것인데, 그 감각을 실제 코드를 짜며 익혔습니다.
동시성 버그는 재현이 어려워서 처음 설계할 때 더 신경 써야 하는 자리라는 걸 배웠습니다.