Go 채널 패턴 - 제한된 팬아웃

Go 프로그래밍 기술을 향상하고 더 나은 Go 엔지니어가 되기 위해 최근 Ardan Labs에서 우수한 주문형 교육을 구입했습니다. 재료는 Go 전문 엔지니어인 .






빌 케네디 : MIA/-5


@goinggodotnet






와의 대화를 확인하세요. 그는 기술 채용 담당자가 되는 비즈니스를 어떻게 키웠는지에 대한 정말 흥미로운 이야기를 들려줍니다. 내가 아는 최고 중 하나입니다. ardanlabs.buzzsprout.com/1466944/968101…


오후 15:18 - 2021년 12월 9일









저는 Go 모범 사례와 설계 철학에 따라 더 관용적인 코드를 작성하는 방법을 배우는 과정을 기록하기로 결정했습니다.

이 게시물 시리즈는 고루틴을 통한 Go의 오케스트레이션/신호에 사용되는 채널 패턴을 설명합니다.

팬 아웃 경계 패턴



Fan Out Bounded Pattern의 주요 아이디어는 작업을 수행할 제한된 수의 고루틴을 갖는 것입니다.

우리는:
  • 고정된 수의 작업자 고루틴
  • 작업을 생성/읽고 작업자 고루틴으로 전송하는 관리자 고루틴
  • 신호 시맨틱을 제공하는 버퍼링된 채널
  • 사용 가능한 작업에 대해 작업자 고루틴에 알리는 데 사용됨




  • 예시



    Fan Out Bounded Pattern에는 작업(employees 고루틴)을 수행할 고정된 양의 worker가 있습니다.

    또한 작업을 생성하는 (또는 미리 정의된 작업 목록에서 작업을 가져오는) manager ( main goroutine)도 있습니다. Manager는 통신 채널ch을 통해 직원에게 작업에 대해 알립니다. Employee는 통신 채널ch에서 작업을 가져옵니다.

    통신 채널ch은 제한된 양의 작업을 "대기열에"보관할 수 있습니다( buffered channel ). 채널ch이 가득 차면 manager가 대기열에서 작업을 가져올 때까지 employee에서 새 작업을 보낼 수 없습니다.

    직원에게 더 이상 작업이 없으면 manager 통신 채널을 닫습니다 ch .

    모든 employees ( worker 고루틴)이 작업을 완료하면 관리자에게 알리고 모두 집으로 돌아갑니다.

    사용 사례



    이 패턴의 좋은 사용 사례는 수행할 작업이 어느 정도 있지만 실행기 수가 제한된 일괄 처리입니다. 각 실행자는 여러 작업 단위를 처리하는 작업을 수행합니다.

    Go Playground에서 예제를 자유롭게 시도해 보십시오.

    package main
    
    import (
        "fmt"
        "sync"
    )
    
    func main() {
        // 5 peaces of work to do
        work := []string{"paper1", "paper2", "paper3", "paper4", "paper5"}
    
        // number of worker goroutines that will process the work
        // e.g. fixed number of employees
        // g := runtime.NumCPU()
        g := 2
    
        // use waitGroup to orchestrate the work
        // e.g. each employee take one seat in the office to do the work
        //      in this case we have two seats taken
        var wg sync.WaitGroup
        wg.Add(g)
    
        // make buffered channel of type string which provides signaling semantics
        // e.g. manager uses this channel to notify employees about available work
            // if buffer is full, manager can't send new work
        ch := make(chan string, g)
    
        // create and launch worker goroutines
        for e := 0; e < g; e++ {
            go func(emp int) {
                // execute this statement (defer) when this function/goroutine terminates
                // decrement waitGroup when there is no more work to do
                // do this once for-range loop is over and channel is closed
                // e.g. employee goes home
                defer wg.Done()
    
                // for-range loop used to check for new work on communication channel `ch`
                for p := range ch {
                    fmt.Printf("employee %d : received signal : %s\n", emp, p)
                }
    
                // printed when communication channel is closed
                fmt.Printf("employee %d : received shutdown signal\n", emp)
            }(e)
        }
    
        // range over collection of work, one value at the time
        for _, wrk := range work {
            // signal/send work into channel
            // start getting goroutines busy doing work
            // e.g. manager sends work to employee via buffered communication channel
            //      if buffer is full, this operation blocks
            ch <- wrk
        }
    
        // once last piece of work is submitted, close the channel
        // worker goroutines will process everything from the buffer
        close(ch)
    
        // guarantee point, wait for all worker goroutines to finish the work
        // e.g. manager waiits for all employees to go home before closing the office
        wg.Wait()
    
    }
    


    결과




    go run main.go
    
    employee 1 : received signal : paper1
    employee 1 : received signal : paper3
    employee 1 : received signal : paper4
    employee 1 : received signal : paper5
    employee 1 : received shutdown signal
    employee 0 : received signal : paper2
    employee 0 : received shutdown signal
    


    결론



    이 기사에서는 팬아웃 버퍼링된 채널 패턴에 대해 설명했습니다. 또한 간단한 구현이 제공되었습니다.

    자세한 내용은 우수한Ardan Labs 교육 자료를 참조하십시오.

    자원:
  • Ardan Labs
  • Cover image by Igor Mashkov from Pexels
  • Fan out picture
  • 좋은 웹페이지 즐겨찾기