Go 채널 패턴 - 풀링
8536 단어 tutorialprogrammingbeginnersgo
아르단 연구소
@ardanlabs
고전이지만 좋은 것 :) 구조체 유형에 대해 이야기하는 이 비디오는 YouTube에서 재생되고 있습니다! youtu.be/SjNuCurZ-CY
오후 15:25 - 2021년 11월 28일
저는 Go 모범 사례와 설계 철학에 따라 더 관용적인 코드를 작성하는 방법을 배우는 과정을 기록하기로 결정했습니다.
이 게시물 시리즈는 고루틴을 통한 Go의 오케스트레이션/신호에 사용되는 채널 패턴을 설명합니다.
풀링 패턴
풀링 패턴의 기본 아이디어는 다음과 같습니다.
예시
이 예에서 당신은
manager
이고, 많은 새로운 employees
를 고용합니다.Employees
는 무엇을 해야할지 즉시 알지 못하고 manager
가 작업을 제공하기를 기다립니다. 할 일이 있는지 확인하기 위해 채널ch
을 보고 있습니다.manager
가 employees
에 대한 작업을 찾으면 통신 채널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 교육비가 약간 비쌀 수 있습니다. 이 경우 언제든지 그들에게 연락할 수 있으며 장학금 양식에 대한 링크를 제공할 것입니다.
자원:
Reference
이 문제에 관하여(Go 채널 패턴 - 풀링), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/b0r/go-concurrency-patterns-pooling-2ng5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)