Go의 동시성 패턴 작업자 풀 및 팬아웃/팬인

DDD
풀어 주다: 2024-10-07 22:11:01
원래의
616명이 탐색했습니다.

Concurrency patterns in Go; worker pools and fan-out/fan-in

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)
    }
}


로그인 후 복사

이 예에서는:

  • 작업을 동시에 처리하는 직원이 3명 있습니다.
  • 각 작업은 채널을 통해 작업자에게 전달되며 처리를 위해 결과가 수집됩니다.

팬아웃/팬인 패턴

팬아웃/팬인 패턴을 사용하면 여러 고루틴이 동일한 작업을 처리할 수 있는 반면, 팬인은 결과를 다시 단일 출력으로 수집합니다. 작업을 분할한 후 결과를 집계하는 데 유용합니다.


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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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