동시 고루틴 실행 제한
처리할 URL 목록이 있고 실행되는 동시 고루틴 수를 제한하려는 시나리오를 고려해보세요. . 예를 들어 URL이 30개라면 10개의 고루틴만 병렬로 작동하기를 원할 수 있습니다.
제공된 코드는 실행 중인 고루틴 수를 제한하기 위해 병렬 크기의 버퍼링된 채널을 사용하려고 시도합니다. . 그러나 이 접근 방식은 모든 URL을 처리한 후에도 차단되지 않는 것 같습니다. 이러한 동시성 제한을 달성하는 더 효과적인 방법은 지정된 수의 작업자 고루틴을 생성하고 전용 채널을 통해 URL을 제공하는 것입니다.
다음은 개선된 코드 버전입니다.
<code class="go">parallel := flag.Int("parallel", 10, "max parallel requests allowed") flag.Parse() urls := flag.Args() // Create a channel to hold URLs that workers will consume workerURLChan := make(chan string) // Start a goroutine to feed URLs to the workers go func() { for _, u := range flag.Args() { workerURLChan <- u } // Once all URLs have been distributed, close the channel, which will cause workers to exit close(workerURLChan) }() var wg sync.WaitGroup client := rest.Client{} results := make(chan string) // Start the specified number of worker goroutines for i := 0; i < *parallel; i++ { wg.Add(1) go func() { defer wg.Done() // Workers repeatedly fetch URLs from the channel until it is closed for url := range workerURLChan { worker(url, client, results) } }() } // Close the results channel when all workers have completed, which will allow the main goroutine to exit go func() { wg.Wait() close(results) }() // Receive and print results from the worker goroutines for res := range results { fmt.Println(res) }</code>
이 업데이트된 코드에서는 허용된 동시 실행 각각에 대해 작업자 고루틴을 생성하고 이러한 작업자는 전용 채널에서 URL을 가져옵니다. 모든 URL이 배포되면 작업자URLChan이 닫히고 현재 URL이 완료되면 작업자가 종료됩니다. 이 메커니즘은 동시에 실행되는 고루틴의 수를 효과적으로 제한합니다.
위 내용은 Go에서 동시 고루틴 실행을 제한하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!