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")
    }
}
  1. 넌블러킹모드로 메세지를 수신하고 있습니다. messages채널에서 정상적인 값이 있다면,
    <-messages case문이 실행됩니다. 값이 없다면 default case가 곧바로 작동합니다.
  2. 넌블러킹모드로 메세지를 전송하는 것이며, 수신과 유사합니다.
  3. 여러개의 casedefault절을 이용해서 다중 넌블러킹 모드 전송을 구현하고 있습니다.
    예제에서는 messagessignals을 넌블럭모드로 받아서 처리하고 있습니다.

실행하면 다음과 같습니다.

$ go run non-blocking-channel-operations.go 
no message received
no message sent
no activity