Go에서의 제한된 병렬성: 고루틴을 제한하는 세마포어 ... 노트

Go에서의 제한된 병렬성: 고루틴을 제한하는 세마포어 패턴

Go 프로그래밍 언어의 동시성 모델은 고루틴(goroutine)을 통해 강력하지만, 많은 고루틴이 동시에 실행될 때 다운스트림 서비스를 과부하하거나 시스템 제한에 도달하는 문제로 이어질 수 있습니다. 이는 특히 수많은 URL을 가져오는 것과 같은 I/O 바운드 작업에서 더욱 그렇습니다. 일반적인 초기 접근 방식인 URL당 고루틴을 실행하는 것은 파일 디스크립터와 같은 리소스를 고갈시키거나 API 속도 제한을 트리거할 수 있습니다. 핵심 문제는 동시 작업 수가 제어되지 않는 무제한적인 팬아웃(fan-out)입니다.이를 해결하기 위해 동시성은 제한되어야 합니다. 한 가지 효과적인 방법은 버퍼링된 채널을 카운팅 세마포어(counting semaphore)로 사용하는 것으로, 채널로 보내는 것은 슬롯을 획득하고 받는 것은 슬롯을 해제합니다. 더 복잡한 시나리오를 위한 또 다른 접근 방식은 가중치 동시성 제한 및 컨텍스트 인식 획득을 허용하는 x/sync/semaphore 패키지입니다. 오류 처리를 포함하고 실패 시 다른 작업을 중지해야 하는 작업의 경우, SetLimit 메서드를 가진 x/sync/errgroup 패키지가 권장되는 솔루션입니다.errgroup은 또한 오류가 발생할 때 취소되는 파생된 컨텍스트(derived context)를 제공하여 다른 고루틴이 정상적으로 종료될 수 있도록 합니다. 여러 고루틴에서 별도의 슬라이스 인덱스에 쓰는 것은 안전하지만, 공유 가능한 변경 가능한 상태(shared mutable state)는 동기화가 필요합니다. 올바른 동시성 제한 도구를 선택하는 것은 작업이 균일한지, 오류 전파가 필요한지, 가중치 제한이 필요한지에 따라 달라집니다. 최적의 동시성 제한은 CPU 수보다는 종종 외부 API의 허용치와 같은 체인의 가장 약한 리소스에 의해 결정됩니다. 제한된 병렬성(bounded parallelism)은 고루틴 수가 입력 크기가 아닌 리소스에 따라 확장되도록 하여 서비스 붕괴를 방지합니다.
CdXz5zHNQW_KTysiL4mCy.webp