Go by Example: [29] Non Blocking Channel Operations
Non Blocking Channel Operations
기본적으로 채널에 데이터를 보내고 받는 행위는 블럭모드(Blocking Mode
)로 작동합니다.
그러나, select
문과 default
절을 이용하ㅏ면 비블럭모드(Non-Blocking Mode
)를 구현할 수 있습니다.
즉, 채널에서 데이터를 전송/수신 대기없이 곧바로 작업할 수 있게 되는 것입니다.
package main
import "fmt"
func main() {
messages := make(chan string)
signals := make(chan bool)
select { // [1]
case msg := <-messages:
fmt.Println("received message", msg)
default:
fmt.Println("no message received")
}
msg := "hi" // [2]
select {
case messages <- msg:
fmt.Println("sent message", msg)
default:
fmt.Println("no message sent")
}
select { // [3]
case msg := <-messages:
fmt.Println("received message", msg)
case sig := <-signals:
fmt.Println("received signal", sig)
default:
fmt.Println("no activity")
}
}
- 넌블러킹모드로 메세지를 수신하고 있습니다.
messages
채널에서 정상적인 값이 있다면,
<-messages
case문이 실행됩니다. 값이 없다면default case
가 곧바로 작동합니다. - 넌블러킹모드로 메세지를 전송하는 것이며, 수신과 유사합니다.
- 여러개의
case
와default
절을 이용해서 다중 넌블러킹 모드 전송을 구현하고 있습니다.
예제에서는messages
와signals
을 넌블럭모드로 받아서 처리하고 있습니다.
실행하면 다음과 같습니다.
$ go run non-blocking-channel-operations.go
no message received
no message sent
no activity