프로그래밍 언어/Go
Go bufferChannel vs unBufferChannel
65살까지 코딩
2023. 4. 5. 21:47
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
반응형