> 백엔드 개발 > Golang > Go에서 동시 고루틴 실행을 제한하는 방법은 무엇입니까?

Go에서 동시 고루틴 실행을 제한하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2024-11-02 05:27:02
원래의
1064명이 탐색했습니다.

How to Limit Concurrent Goroutine Execution in Go?

동시 고루틴 실행 제한

처리할 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿