채널의 경우 1개로 해두면 하나가 들어갈 때 까지 해당 위치에서 블로킹 된다.
아래 예제는 받는 부분을 삭제했는데 그렇기에 채널을 통해 전송은 되지만 수신하지 않아 비워지지 않기 때문에
one을 출력하지 못하고 멈춰있는 것을 확인할 수 있다.
package main import ( f "fmt" "time" ) func main() { f.Println("select") c1 := make(chan string) c2 := make(chan string) go func() { time.Sleep(time.Second * 1) f.Println("---") c1 <- "one" f.Println("one") c1 <- "two" f.Println("two") c1 <- "three" f.Println("three") c1 <- "four" f.Println("four") }() go func() { time.Sleep(time.Second * 2) c2 <- "fifth" }() for i := 0; i < 10000000000; i++ { time.Sleep(time.Second) } } |
$ go run go.go select --- ^Csignal: interrupt |
다만, make를 통해 채널 버퍼를 n개로 만들어 두면, 넣을 수 있는 동안은 넣고 블로킹 되지 않고 넘어갈 수 있다.
package main import ( f "fmt" "time" ) func main() { f.Println("select") c1 := make(chan string, 4) c2 := make(chan string) go func() { time.Sleep(time.Second * 1) f.Println("---") c1 <- "one" f.Println("one") c1 <- "two" f.Println("two") c1 <- "three" f.Println("three") c1 <- "four" f.Println("four") }() go func() { time.Sleep(time.Second * 2) c2 <- "fifth" }() for i := 0; i < 10000000000; i++ { time.Sleep(time.Second) } } |
$ go run go.go select --- one two three four ^Csignal: interrupt |
'Programming > golang' 카테고리의 다른 글
golang echo server middleware (0) | 2023.05.24 |
---|---|
golang 동시성 (0) | 2023.05.24 |
golang switch, select (0) | 2023.05.16 |
golang uds (0) | 2023.05.16 |
golang mutex (sync) (0) | 2023.05.16 |