Go는 탁월한 동시성 모델로 유명하지만 많은 개발자는 고루틴과 채널에만 집중합니다. 그러나 작업자 풀 및 팬아웃/팬인과 같은 동시성 패턴은 실질적인 효율성을 제공합니다.
이 기사에서는 Go 애플리케이션의 처리량을 극대화하는 데 도움이 되는 고급 개념을 설명합니다.
동시성을 통해 프로그램은 특히 I/O 작업, 웹 요청 또는 백그라운드 처리와 같은 작업을 처리할 때 작업을 효율적으로 수행할 수 있습니다. Go에서 고루틴은 수천 개의 동시 작업을 관리할 수 있는 가벼운 방법을 제공하지만 구조가 없으면 병목 현상이 발생할 수 있습니다. 여기서 작업자 풀과 팬아웃/팬인 패턴이 필요합니다.
작업자 풀을 사용하면 고정된 "작업자"에게 작업을 할당하여 고루틴 수를 제한할 수 있습니다. 이를 통해 초과 구독을 방지하고 리소스 소비를 줄이며 작업 실행을 관리하기 쉽게 만듭니다.
package main import ( "fmt" "sync" "time" ) func worker(id int, jobs <-chan int, results chan<- int, wg *sync.WaitGroup) { defer wg.Done() for j := range jobs { fmt.Printf("Worker %d started job %d\n", id, j) time.Sleep(time.Second) // Simulate work fmt.Printf("Worker %d finished job %d\n", id, j) results <- j * 2 } } func main() { jobs := make(chan int, 100) results := make(chan int, 100) var wg sync.WaitGroup // Start 3 workers for w := 1; w <= 3; w++ { wg.Add(1) go worker(w, jobs, results, &wg) } // Send jobs for j := 1; j <= 5; j++ { jobs <- j } close(jobs) // Wait for workers to finish wg.Wait() close(results) for result := range results { fmt.Println("Result:", result) } }
이 예에서는:
팬아웃/팬인 패턴을 사용하면 여러 고루틴이 동일한 작업을 처리할 수 있는 반면, 팬인은 결과를 다시 단일 출력으로 수집합니다. 작업을 분할한 후 결과를 집계하는 데 유용합니다.
package main import ( "fmt" "sync" "time" ) func workerFanOut(id int, tasks <-chan int, wg *sync.WaitGroup) { defer wg.Done() for task := range tasks { fmt.Printf("Worker %d processing task %d\n", id, task) time.Sleep(time.Second) // Simulate work } } func main() { var wg sync.WaitGroup tasks := make(chan int, 10) // Fan-out: Launch multiple workers for i := 1; i <= 3; i++ { wg.Add(1) go workerFanOut(i, tasks, &wg) } // Send tasks for i := 1; i <= 9; i++ { tasks <- i } close(tasks) // Wait for workers to finish wg.Wait() fmt.Println("All tasks are processed.") }
위 코드에서:
동시성 패턴을 적용하여 웹 서버, 일괄 처리 시스템 또는 I/O 바인딩 애플리케이션을 최적화할 수 있습니다. 작업자 풀 및 팬아웃/팬인과 같은 패턴을 사용하면 시스템 용량에 부담을 주지 않으면서 최적의 리소스 사용이 보장됩니다.
지식을 높이기 위한 다음 단계:
- 이러한 패턴을 다른 동시성 문제로 어떻게 확장할 수 있는지 살펴보세요.
- 요청을 관리하는 작업자 풀로 실시간 웹 서비스를 구축하세요.
Go 동시성 성공의 열쇠는 구조입니다. 이러한 동시성 패턴을 익히면 Go 기술 수준이 향상되고 고성능 애플리케이션을 작성하는 데 도움이 됩니다.
다음 게시물에서 Go에 대한 더 많은 통찰력을 기대해주세요!
책을 구매하시면 저를 후원하실 수 있습니다 :)
위 내용은 Go의 동시성 패턴 작업자 풀 및 팬아웃/팬인의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!