일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 백준 1504 java
- ipfs singletone
- java 1509
- java 파티
- 익명 객체 @transactional
- 자바 1676
- kotiln functional interface
- 백준 연결요소 자바
- kotiln const
- 자바 백준 팩토리얼 개수
- Java Call By Refernce
- java 백준 1509
- java 팩토리얼 개수
- 백준 특정한 최단 경로
- Spring ipfs
- javav 1676
- kotiln const val
- mongodb lookup
- spring mongodb
- spring mongoTemplate
- go
- 안정해시
- rabbitmq 싱글톤
- nodejs rabbitmq
- ipfs bean
- 전략 패턴이란
- spring mongodb switch
- java 1238
- spring mongoTemplate switch
- 백준 2252 줄세우기
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 |