비동기적으로 처리해야 하는 URL 목록으로 작업할 때 동시 Go 루틴 수를 다음으로 제한하는 것이 바람직한 경우가 많습니다. 과도한 자원을 방지합니다. 이 솔루션에는 동시에 실행할 수 있는 최대 고루틴 수를 제어하는 제한된 채널을 생성하는 것이 포함됩니다.
원래 시도에서는 병렬 크기의 버퍼링된 채널이 생성되었습니다.
<code class="go">results := make(chan string, *parallel)</code>
결과 채널이 가득 차면 채널에서 값을 읽을 때까지 프로그램이 차단되어 다른 고루틴이 실행될 수 있도록 의도했습니다. 생성되었습니다. 그러나 이 접근 방식은 모든 URL이 처리될 때 기본 프로그램이 차단되지 않으므로 고루틴 수를 효과적으로 제한하지 않습니다.
보다 효과적인 해결 방법은 고정된 URL을 만드는 것입니다. 작업자 고루틴 수:
<code class="go">for i := 0; i < *parallel; i++ { wg.Add(1) go func() { defer wg.Done() for url := range urls { worker(url, client, results) } }() }</code>
이 솔루션에서 고루틴은 채널에서 URL을 가져와 처리하는 역할을 담당합니다. 채널에는 피더 고루틴의 URL이 제공되며 모든 URL이 검색되면 피더 고루틴은 채널을 닫고 작업자에게 작업을 완료하라는 신호를 보냅니다.
별도의 고루틴은 작업자의 완료 상태를 모니터링합니다. 고루틴, 모든 작업자가 완료되면 결과 채널을 닫습니다. 이 접근 방식은 실행 중인 고루틴의 수를 지정된 병렬 수로 효과적으로 제한합니다.
위 내용은 채널을 사용하여 동시 Go 루틴을 효과적으로 제한하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!