sync 또는 channel? Go 동기화에서 적절한 선택
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
Go 언어를 사용하는 중급 이상의 개발자, 특히 동시성 프로그래밍을 다루는 개발자
핵심 요약
- Go에서 동기화는 channel을 사용하는 것이 권장되지만, 성능이 더 중요한 경우
sync
패키지를 사용하는 것이 적절함 sync.Mutex
와sync.RWMutex
의 성능 차이: 동기화 빈도가 높을수록RWMutex
의 읽기 성능 우위가 두드러짐sync
패키지의Mutex
/RWMutex
는 구조체 소유권을 잃지 않으며, 여러 goroutine이 동기적으로 리소스에 접근할 수 있음
섹션별 세부 요약
1. Go의 동기화 전략: channel vs `sync` 패키지
- C 언어와 달리 Go는 "메모리 공유 대신 channel을 통한 통신"을 권장함
sync
패키지는 고수준의 동기화 기능을 제공하지만, channel과 비교해 성능 저하가 있음sync
패키지의 장점: 구조체 소유권 유지, 복수 goroutine의 리소스 접근 허용
2. `sync` 패키지의 주요 구조체
Mutex
,RWMutex
,Once
,Cond
,Pool
,atomic
패키지 포함Mutex
는 공유 리소스 접근 제어에 주로 사용되며,RWMutex
는 읽기/쓰기 분리 기능 제공
3. 성능 비교 테스트 결과
- 읽기 작업 시:
RWMutex
의 읽기 성능이Mutex
보다 20-30% 빠름 - 쓰기 작업 시:
RWMutex
의 쓰기 성능이Mutex
보다 최대 50% 느림 - 동기화 빈도가 증가할수록:
Mutex
의 성능 저하가 더 심각함
4. `sync` 패키지 사용 시 주의사항
Mutex
/RWMutex
를 사용 후 복사 금지 (복사는 사용 전에만 허용)- 예제 코드에서
g3
가 출력되지 않는 문제: 복사된Mutex
가 락을 해제하지 못해 데드락 발생
결론
- 동기화가 필요한 경우:
sync
패키지의RWMutex
를 읽기 중심 작업에,Mutex
를 쓰기 중심 작업에 사용 - 데드락 방지를 위해:
Mutex
/RWMutex
복사는 사용 전에만 수행 - 성능 최적화를 위해: 높은 동시성 작업은
RWMutex
사용, 단순 동기화는 channel을 고려