일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- spring mongodb switch
- 안정해시
- 백준 특정한 최단 경로
- 익명 객체 @transactional
- go
- mongodb lookup
- java 1509
- 자바 백준 팩토리얼 개수
- Spring ipfs
- 백준 2252 줄세우기
- Java Call By Refernce
- java 파티
- javav 1676
- 전략 패턴이란
- ipfs bean
- java 팩토리얼 개수
- rabbitmq 싱글톤
- java 백준 1509
- java 1238
- kotiln const val
- ipfs singletone
- spring mongodb
- kotiln const
- 백준 연결요소 자바
- nodejs rabbitmq
- 자바 1676
- kotiln functional interface
- spring mongoTemplate
- spring mongoTemplate switch
- 백준 1504 java
Archives
- Today
- Total
공부 흔적남기기
Go bufferChannel vs unBufferChannel 본문
728x90
반응형
Go에서 자주사용하는 GoRoutine에서 필수적인 Channel
흔히 사용하는 것은 unBufferChannel 이지만 bufferChannel의 존재를 알게 되어 정리함.
먼저 unBufferChannel은 말그대로 채널에 버퍼가 없기때문에 (공간이 하나밖에 없다는 말) channel에 데이터가 들어가면 그 데이터가 소비될 때까지 blocking이 된다.
하지만 bufferChannel은 코더가 채널의 버퍼 크기를 정해주어 channel에 해당 개수까지는 데이터가 차고 그다음에 데이터가 소비될 때까지 blocking 되는 것이다.
package BufferdVersusUnBufferedChannel
import (
"fmt"
"math/rand"
"time"
)
var hamburgerMaterial = [...]string{"소세지", "치킨", "불고기", "새우", "계란", "야채", "민트초코"}
func orderHanBurger(c chan<- string) {
for i := range [5]int{} {
material := hamburgerMaterial[rand.Intn(7)]
orderNumber := i + 1
fmt.Printf("order %s buger. order number is %d\n", material, orderNumber)
c <- fmt.Sprintf("make %s burger. order number is %d\n", material, orderNumber)
}
close(c)
}
func makeHamburger(c <-chan string) {
for {
time.Sleep(time.Second * 5)
order, ok := <-c
println(order)
if !ok {
break
}
}
}
func Start() {
unBufferChannel := make(chan string)
bufferChannelSize5 := make(chan string, 5)
fmt.Println("start unBuffer order Hamburger")
go orderHanBurger(unBufferChannel)
makeHamburger(unBufferChannel)
fmt.Println("finish unBuffer order Hamburger")
fmt.Println()
fmt.Println("start Buffer order Hamburger")
go orderHanBurger(bufferChannelSize5)
makeHamburger(bufferChannelSize5)
fmt.Println("finish Buffer order Hamburger")
}
위의 코드에서 보다시피 unBufferChannel은 채널의 버퍼크기가 1로 잡히는게 아니라 아에 버퍼가 존재하지 않아서 blocking 되는 것이고 이를 원하지 않는다면 buffer size를 최소 1 이상 을 주면된다. 나는 bufferChannel에는 임의로 사이즈 5를 주었다.
따라서 unBufferChannel을 사용할 때에는 makeHamber에서 하나씩 계속 기다려야 하지만
bufferChannel에서는 주문이 먼저 5개가 들어간 후에 makeHamburger가 진행된다.
728x90
반응형
'프로그래밍 언어 > Go' 카테고리의 다른 글
blockchain with go 회고 (0) | 2023.04.16 |
---|---|
Go Interface 사용법 (0) | 2023.02.20 |