고루틴을 활용하면서 URL 목록을 처리할 때 동시 Go 루틴 수를 어떻게 제한할 수 있나요?
Oct 31, 2024 am 11:31 AM동시 Go 루틴 수 제한
문제:
URL 목록을 처리하려고 합니다. 고루틴을 동시에 사용하지만 동시에 실행되는 고루틴의 사전 정의된 최대 수를 사용합니다. 이 경우 URL이 30개 있음에도 불구하고 병렬화를 동시에 10개의 고루틴으로 제한하려고 합니다.
해결책:
이 문제를 해결하는 열쇠는 코드 아키텍처. 각 URL에 대해 별도의 고루틴을 생성하는 대신 공유 채널에서 URL을 사용하는 제한된 수의 작업자 고루틴을 생성하세요. 이 채널의 버퍼링 특성으로 인해 동시성이 조절됩니다.
코드 수정:
다음은 이 접근 방식을 통합한 업데이트된 코드 버전입니다.
<code class="go">package main import ( "flag" "fmt" "os" "sync" "time" ) func main() { parallel := flag.Int("parallel", 10, "max parallel requests allowed") flag.Parse() urls := flag.Args() // Create a buffered channel to buffer URLs urlsChan := make(chan string, *parallel) // Create a separate goroutine to feed URLs into the channel go func() { for _, u := range urls { urlsChan <- u } // Close the channel to indicate that there are no more URLs to process close(urlsChan) }() 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() // Continuously retrieve URLs from the channel until it is closed for url := range urlsChan { worker(url, client, results) } }() } // Launch a separate goroutine to close the results channel when all workers are finished go func() { // Wait for all workers to finish processing URLs wg.Wait() // Close the results channel to signal that there are no more results close(results) }() // Read results from the channel until it is closed for res := range results { fmt.Println(res) } os.Exit(0) }</code>
수정된 코드:
- 처리할 URL을 보관하기 위해 버퍼링된 채널인 urlsChan이 생성됩니다. 버퍼 크기는 *병렬로 설정되어 채널에 동시에 액세스할 수 있는 고루틴 수를 효과적으로 제한합니다.
- 별도의 고루틴은 urlsChan 채널을 URL로 채우는 데 사용됩니다.
- 작업자 고루틴 urlsChan 채널이 닫힐 때까지 계속해서 URL을 사용합니다.
- 모든 작업자가 작업을 완료하면 결과 채널을 닫는 별도의 고루틴이 사용됩니다.
이 수정된 아키텍처를 활용하여 , 지정된 병렬 처리 제한에 따라 동시에 실행되는 고루틴 수를 효과적으로 조절할 수 있습니다.
위 내용은 고루틴을 활용하면서 URL 목록을 처리할 때 동시 Go 루틴 수를 어떻게 제한할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

인기 기사

인기 기사

뜨거운 기사 태그

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Go Language Pack 가져 오기 : 밑줄과 밑줄이없는 밑줄의 차이점은 무엇입니까?

이동 중에 테스트를 위해 모의 개체와 스터브를 작성하려면 어떻게합니까?

Beego 프레임 워크에서 페이지간에 단기 정보 전송을 구현하는 방법은 무엇입니까?

GO에서 제네릭에 대한 사용자 정의 유형 제약 조건을 어떻게 정의 할 수 있습니까?

추적 도구를 사용하여 GO 응용 프로그램의 실행 흐름을 이해하려면 어떻게해야합니까?

Linters 및 정적 분석 도구를 사용하여 GO 코드의 품질과 유지 관리를 향상시킬 수 있습니까?

MySQL 쿼리 결과 목록을 GO 언어로 사용자 정의 구조 슬라이스로 변환하는 방법은 무엇입니까?
