고루틴을 활용하면서 URL 목록을 처리할 때 동시 Go 루틴 수를 어떻게 제한할 수 있나요?

Mary-Kate Olsen
풀어 주다: 2024-10-31 11:31:02
원래의
394명이 탐색했습니다.

How can you limit the number of concurrent Go routines when processing a list of URLs while utilizing goroutines?

동시 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>
로그인 후 복사

수정된 코드:

  1. 처리할 URL을 보관하기 위해 버퍼링된 채널인 urlsChan이 생성됩니다. 버퍼 크기는 *병렬로 설정되어 채널에 동시에 액세스할 수 있는 고루틴 수를 효과적으로 제한합니다.
  2. 별도의 고루틴은 urlsChan 채널을 URL로 채우는 데 사용됩니다.
  3. 작업자 고루틴 urlsChan 채널이 닫힐 때까지 계속해서 URL을 사용합니다.
  4. 모든 작업자가 작업을 완료하면 결과 채널을 닫는 별도의 고루틴이 사용됩니다.

이 수정된 아키텍처를 활용하여 , 지정된 병렬 처리 제한에 따라 동시에 실행되는 고루틴 수를 효과적으로 조절할 수 있습니다.

위 내용은 고루틴을 활용하면서 URL 목록을 처리할 때 동시 Go 루틴 수를 어떻게 제한할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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