main_function

[Go/Golang] 채널(channel) 본문

Programming

[Go/Golang] 채널(channel)

MAIN 2021. 1. 20. 20:15

호어의 CSP(Communicating Sequential Processes) 컨셉에서 파생된 Go의 채널은 동기화 기본 요소 중 하나입니다. 앞선 에서 언급했던 것처럼 

메모리 공유를 통해 통신하지 말라! 대신 통신을 통해 메모리를 공유해라!

라는 것이 모토입니다.

이는 스트림처럼 어딘가에서 데이터를 흘려보내면 다른 곳에서 그 값을 받아서 사용합니다. 

// 양방향 채널
var thisIsChannel chan interface {}
thisIsChannel = make(chan interface{})

// 단방향 채널
var receiveChannel <-chan interface{} // 수신 전용 채널
var sendChannel chan<- interface{}    // 송신 전용 채널

stringStream := make(chan string)
go func() {
    stringStream <- "Hello"
}()

fmt.Println(<-stringStream)

 

Buffered / Unbuffered channel

아래와 같이 채널 생성시 버퍼의 크기를 입력해주면 buffered 채널이 생성되고 그렇지 않으면 unbuffered 채널이 생성됩니다.

  • dataStream := make(chan interface{}, 10)
    : 버퍼링된 채널 같은 경우 채널에서 읽기가 수행되지 않더라도 버퍼 크기만큼의 데이터를 받아줄 수 있습니다. 단, 버퍼가 꽉 차게 되면 blocking을 하고 버퍼에 빈 자리가 생길 때까지 기다립니다.
  • dataStream := make(chan interface{})
    : 버퍼가 없는 채널은 데이터를 보낼 때 다른 곳에서 데이터를 전달받을 것을 보장하기 위해 blocking을 하게 됩니다.

만약 버퍼 사이즈가 3인 정수형 채널을 생성했다면 큐에 쌓이듯이 1,2,3은 순차적으로 블록킹 없이 채널로 들어오게 됩니다. 물론 중간에 채널에서 값을 읽어가면 FIFO 구조로 먼저 데이터가 빠지겠지만요. 중간에 그런 과정이 없다면 1, 2, 3이 순차적으로 쌓이고 채널의 버퍼가 다 차게 되면 그 뒤에 값을 넣는 부분에서 블록킹이 됩니다. 이후 채널에서부터 값을 받아가면 블록킹되어 있던 4가 채널로 전송이됩니다.

 

'Programming' 카테고리의 다른 글

[Go/Golang] 2. 고루틴(goroutine) Deep Dive  (0) 2021.01.13
[Go/Golang] 1. 동시성(Concurrency)  (0) 2021.01.13
Go 언어(golang)의 특징  (0) 2021.01.09
Comments