동시 Go 루틴 제한
코드에서 동시 Go 루틴 수를 제한하려고 합니다. 그러나 현재 구현은 의도한 대로 작동하지 않습니다. 대체 접근 방식은 다음과 같습니다.
해결책:
각 URL에 대해 goroutine을 만드는 대신 공유 채널에서 URL을 처리하는 고정된 수의 작업자를 만듭니다. 수정된 코드는 다음과 같습니다.
<code class="go">parallel := flag.Int("parallel", 10, "max parallel requests allowed") flag.Parse() // Workers get URLs from this channel urls := make(chan string) // Feed the workers with URLs go func() { for _, u := range flag.Args() { urls <- u } // Workers will exit from range loop when channel is closed close(urls) }() var wg sync.WaitGroup client := rest.Client{} results := make(chan string) // Start the specified number of workers. for i := 0; i < *parallel; i++ { wg.Add(1) go func() { defer wg.Done() for url := range urls { worker(url, client, results) } }() } // When workers are done, close results so that main will exit. go func() { wg.Wait() close(results) }() for res := range results { fmt.Println(res) }</code>
설명:
이것은 접근 방식을 사용하면 주어진 시간에 최대 병렬 고루틴이 활성화되어 동시성을 원하는 대로 제한할 수 있습니다.
위 내용은 동시 Go 루틴을 효과적으로 제한하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!