Go 채널 패턴 - 제한된 팬아웃
9351 단어 tutorialbeginnerprogramminggo
빌 케네디 : 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 교육 자료를 참조하십시오.
자원:
Reference
이 문제에 관하여(Go 채널 패턴 - 제한된 팬아웃), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/b0r/go-channel-patterns-fan-out-bounded-3ja8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)