Go 채널 패턴 - 풀링

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






아르단 연구소


@ardanlabs






고전이지만 좋은 것 :) 구조체 유형에 대해 이야기하는 이 비디오는 YouTube에서 재생되고 있습니다! youtu.be/SjNuCurZ-CY


오후 15:25 - 2021년 11월 28일









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

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

풀링 패턴



풀링 패턴의 기본 아이디어는 다음과 같습니다.
  • 시그널링 시맨틱을 제공하는 채널
  • 버퍼링되지 않은 채널은 고루틴이 신호를 수신했음을 보장하는 데 사용됩니다
  • .

  • 작업을 위해 해당 채널을 풀링하는 여러 고루틴
  • 채널을 통해 작업을 보내는 고루틴

  • 예시



    이 예에서 당신은 manager 이고, 많은 새로운 employees 를 고용합니다.
    Employees는 무엇을 해야할지 즉시 알지 못하고 manager가 작업을 제공하기를 기다립니다. 할 일이 있는지 확인하기 위해 채널ch을 보고 있습니다.
    manageremployees에 대한 작업을 찾으면 통신 채널paper을 통해 신호(ch)를 전송하여 알립니다.

    채널employee에서 신호를 보는 첫 번째 사용 가능ch이 작업을 완료합니다.

    그 후employee 작업을 완료하고 다시 한 번 더 많은 작업을 수행할 수 있으며 채널ch에서 새 신호를 기다리기 시작합니다.

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

    package main
    
    import (
        "fmt"
        "time"
    )
    
    func main() {
        // make channel of type string which provides signaling semantics
        // unbuffered channel provides a guarantee that the
        // signal being sent is received
        ch := make(chan string)
    
        // number of goroutines to create, numCPU() is a good starting point
        //g := runtime.NumCPU()
        g := 3
    
        for e := 0; e < g; e++ {
            // a new goroutine is created for each employee
            go func(emp int) {
                // employee waits for the signal that there is some work to do
                            // all goroutines are blocked on the same channel `ch` recieve
                for p := range ch {
                    fmt.Printf("employee %d : received signal : %s\n", emp, p)
                }
    
                // when all work is sent, manager notifies all employees by closing the channel
                // once the channel is closed, employee breaks out of the for-range loop
                fmt.Printf("employee %d : revieved shutdown signal\n", emp)
            }(e)
        }
    
        // amount of work to be done
        const work = 10
    
        for w := 0; w < work; w++ {
            // when work is ready, we send signal from the manager to the employee
            // sender (manager) has a guarantee that the worker (employee) has received the signal
            // manager doesn't care about which employee received a signal,
            // since all employees are capable of doing the work
            ch <- "paper"
    
            fmt.Println("manager : sent signal :", w)
        }
    
        // when all work is sent the manages notifies all employees by closing the channel
        // unbuffered channel provides a guarantee that all work has been sent
        close(ch)
        fmt.Println("manager : sent shutdown signal")
    
        time.Sleep(time.Second)
    
    }
    
    


    결과(1차 실행)




    go run main.go
    
    employee 2 : recieved signal : paper
    manager : sent signal : 0
    manager : sent signal : 1
    manager : sent signal : 2
    manager : sent signal : 3
    employee 1 : recieved signal : paper
    employee 1 : recieved signal : paper
    employee 2 : recieved signal : paper
    manager : sent signal : 4
    manager : sent signal : 5
    manager : sent signal : 6
    employee 1 : recieved signal : paper
    employee 1 : recieved signal : paper
    employee 0 : recieved signal : paper
    employee 2 : recieved signal : paper
    manager : sent signal : 7
    manager : sent signal : 8
    manager : sent signal : 9
    manager : sent shutdown signal
    employee 0 : recieved signal : paper
    employee 0 : revieved shutdown signal
    employee 2 : revieved shutdown signal
    employee 1 : recieved signal : paper
    employee 1 : revieved shutdown signal
    


    결론



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

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

    메모



    출신 국가에 따라 Ardan Labs 교육비가 약간 비쌀 수 있습니다. 이 경우 언제든지 그들에게 연락할 수 있으며 장학금 양식에 대한 링크를 제공할 것입니다.

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