고정된 동시 고루틴 수 유지
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!