공부 흔적남기기

Go bufferChannel vs unBufferChannel 본문

프로그래밍 언어/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
반응형

'프로그래밍 언어 > Go' 카테고리의 다른 글

blockchain with go 회고  (0) 2023.04.16
Go Interface 사용법  (0) 2023.02.20