Go 언어로 여러 코루틴을 여는 방법에 대해 이야기해 보겠습니다.

PHPz
풀어 주다: 2023-04-11 11:32:14
원래의
897명이 탐색했습니다.

최근 몇 년 동안 Go 언어는 인터넷 분야에서 가장 인기 있는 프로그래밍 언어 중 하나로 자리 잡았으며 대규모 동시성 및 고성능 분야에서 뛰어난 성능을 발휘합니다. 동시 요청을 처리할 때 여러 Go 코루틴을 여는 것은 시스템 성능과 응답 속도를 향상시키는 중요한 방법입니다. 그렇다면 더 많은 Go 코루틴을 여는 방법은 무엇일까요?

Go 언어의 고루틴은 스레드와 유사하지만 더 가볍고 효율적입니다. 고루틴을 사용하면 병렬 컴퓨팅, 비동기 IO 등 멀티 태스킹 처리를 쉽게 구현할 수 있습니다.

먼저, goroutine을 사용하여 동시에 여러 요청을 처리하는 방법을 보여주는 간단한 예를 살펴보겠습니다.

func main() {
    urls := []string{
        "http://www.google.com/",
        "http://www.apple.com/",
        "http://www.microsoft.com/",
        "http://www.facebook.com/",
    }

    for _, url := range urls {
        go request(url)
    }

    time.Sleep(time.Second)
}

func request(url string) {
    resp, err := http.Get(url)
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(url, len(body))
}
로그인 후 복사

위 코드는 여러 웹사이트의 콘텐츠를 동시에 가져오는 방법을 보여줍니다. 우리는 goroutine을 사용하여 동시에 처리합니다. 모든 요청. 하지만 실제 애플리케이션에서 위의 코드를 직접 사용하게 되면 고루틴이 너무 많이 생성될 수 있고, 심지어 시스템이 다운되는 경우도 발생할 수 있습니다.

따라서 고루틴이 시스템 부하 허용 범위 내에서 실행될 수 있도록 최적화를 통해 고루틴 수를 제어해야 합니다.

우선, 고루틴 수를 제한하여 동시성을 제어할 수 있습니다. Go 언어에서는 waitgroup(동기화 패키지의 도구 유형)을 사용하여 고루틴 수를 제어할 수 있습니다.

다음은 샘플 프로그램입니다.

func main() {
    urls := []string{
        "http://www.google.com/",
        "http://www.apple.com/",
        "http://www.microsoft.com/",
        "http://www.facebook.com/",
    }

    var wg sync.WaitGroup
    for _, url := range urls {
        wg.Add(1)
        go func(url string) {
            request(url)
            wg.Done()
        }(url)
    }

    wg.Wait()
}

func request(url string) {
    resp, err := http.Get(url)
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(url, len(body))
}
로그인 후 복사

위 코드에서 WaitGroup은 고루틴 수를 제어하는 ​​데 사용됩니다. 고루틴이 waitgroup.Add(1) 메서드를 호출하면 요청을 처리하기 위해 고루틴을 시작해야 하고, 고루틴이 요청 처리를 마치면 waitgroup.Done() 메서드를 호출해야 함을 의미합니다. 임무가 완료됐다는 거죠.

또한 go 문의 버퍼링 메커니즘을 사용하여 동시성을 제어할 수도 있습니다. Go 언어의 채널은 고루틴 간의 통신을 실현하는 데 도움이 될 수 있으며 고루틴 간의 일정을 제어하는 ​​데 사용될 수 있습니다. 캐시된 채널은 동시성을 제한하여 고루틴 수를 제어할 수 있습니다.

다음은 샘플 프로그램입니다.

func main() {
    urls := []string{
        "http://www.google.com/",
        "http://www.apple.com/",
        "http://www.microsoft.com/",
        "http://www.facebook.com/",
    }

    var wg sync.WaitGroup
    ch := make(chan string, 2)
    for _, url := range urls {
        ch <- url
        wg.Add(1)
        go func() {
            defer wg.Done()
            request(<-ch)
        }()
    }

    wg.Wait()
}

func request(url string) {
    resp, err := http.Get(url)
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(url, len(body))
}
로그인 후 복사

위 코드에서는 캐시된 채널을 사용하고 고루틴 수를 제한하기 위해 용량이 2인 채널을 만듭니다. 동시에 프로그램이 종료되기 전에 모든 고루틴이 완료될 때까지 기다리기 위해 WaitGroup을 사용합니다.

요약하자면, 여러 Go 코루틴을 열려면 다음을 수행해야 합니다.

  1. 과도한 고루틴 생성으로 인한 과도한 시스템 부하를 피하기 위해 고루틴 수를 합리적으로 제어합니다.
  2. WaitGroup 및 채널과 같은 메커니즘을 사용하여 동시성을 제어하고 고루틴 간의 경쟁 및 일정 문제를 방지합니다.
  3. 시스템 리소스를 합리적으로 사용하고, 요청을 동시에 처리하며, 시스템 응답 속도와 성능을 향상시킵니다.

물론 위의 내용은 Go 코루틴을 더 많이 여는 아이디어와 방법일 뿐입니다. 실제 제작에서는 여전히 특정 요구에 따라 최적화하고 설계해야 합니다. 이러한 기본 지식을 갖추면 Go 언어의 다중 코루틴 문제를 더 잘 처리할 수 있을 것이라고 믿습니다.

위 내용은 Go 언어로 여러 코루틴을 여는 방법에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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