>백엔드 개발 >Golang >Go에서 고정된 수의 동시 고루틴을 유지하는 방법은 무엇입니까?

Go에서 고정된 수의 동시 고루틴을 유지하는 방법은 무엇입니까?

DDD
DDD원래의
2024-12-06 09:15:10437검색

How to Maintain a Fixed Number of Concurrent Goroutines in Go?

고정된 동시 고루틴 수 유지

Go에서는 동시에 실행되는 고루틴 수를 제어하는 ​​것이 중요한 시나리오에 직면할 수 있습니다. 튜토리얼은 종종 고루틴이 완료될 때까지 기다리는 데 중점을 두지만, 특정 시간에 특정 수의 활성 고루틴을 달성하는 것은 다른 과제를 제시합니다.

다음 상황을 고려해보세요. 처리해야 할 작업이 수십만 개가 있습니다. 각 작업을 처리하려면 자체 고루틴이 필요하지만 시스템 리소스는 최대 20개의 동시 고루틴만 처리할 수 있습니다. 항상 20개의 고루틴이 실행되고 있는지 확인하고 기존 고루틴이 완료될 때마다 새 고루틴을 시작해야 합니다.

제한된 병렬성

이를 달성하려면 Go 동시성 패턴 기사에서는 "제한된 병렬성"이라는 패턴을 사용할 것을 제안합니다. 여기에는 동시 작업자 수를 제한하기 위해 빈 구조체 채널을 가드로 사용하는 작업이 포함됩니다.

구현

다음은 이 패턴을 구현하는 방법을 보여주는 예입니다.

package main

import (
    "fmt"
    "sync"
)

func main() {
    const maxGoroutines = 20

    // Create a channel of empty structs to control worker count
    guard := make(chan struct{}, maxGoroutines)

    var wg sync.WaitGroup

    // Launch workers
    for i := 0; i < 30; i++ {
        wg.Add(1)
        guard <- struct{}{} // Blocks if guard channel is filled
        go func(n int) {
            defer wg.Done()
            worker(n)
            <-guard // Release slot in guard channel
        }(i)
    }
    wg.Wait()
}

func worker(i int) { fmt.Println("doing work on", i) }

이 예에서는 가드 채널이 토큰 버킷으로 사용됩니다. 동시에 실행될 수 있는 최대 고루틴 수는 채널 용량(이 경우 20개)에 따라 제한됩니다. 각 고루틴은 작업을 시작하기 전에 채널에서 "토큰"(빈 구조체)을 획득합니다. 고루틴이 완료되면 해당 토큰을 채널에 다시 릴리스하여 다른 고루틴이 획득할 수 있도록 합니다. 채널의 토큰 수를 제어함으로써 동시 고루틴 수를 효과적으로 제어할 수 있습니다.

위 내용은 Go에서 고정된 수의 동시 고루틴을 유지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.