Go by Example: [30] Closing Channels

Closing Channels

Closing Channels은 더이상 채널을 이용한 작업을 하지 않는다는 표시를 하는 것입니다.
이 기능은 채널 수신자에서 더이상 채널통신을 하지 못하게 할때 유용하게 사용합니다.

package main

import "fmt"

func main() {                                      // [1]
    jobs := make(chan int, 5)
    done := make(chan bool)
    
    go func() {                                    // [2]
        for {
            j, more := <-jobs
            if more {
                fmt.Println("received job", j)
            } else {
                fmt.Println("received all jobs")
                done <- true
                return
            }
        }
    }()
    
    for j := 1; j <= 3; j++ {                     // [3]
        jobs <- j
        fmt.Println("sent job", j)
    }
    
    close(jobs)
    fmt.Println("sent all jobs")
    
    <-done                                        // [4]
}
  1. 예제에서는 main()함수 고루틴에서 작업 고루틴으로 jobs채널을을 이용해서 통신하고 있습니다.
    더이상 작업 고루틴에서 작업을 하지 않는다면 jobs채널을 close하여 종료 처리를 합니다.
  2. 작업 고루틴입니다. jobs채널에서 계속적으로 (j만큼) more := <- jobs 메세지를 수신합니다.
    만약 more값이 거짓이면 채널에서 모든값을 수신한 것이며 jobs채널을 닫습니다.
    done채널값은 참/거짓을 기준으로 모든 메세지를 수신한 것인지를 알아내고 있습니다.
  3. 3개의 작업으로 작업 고루틴에서 처리했다면, jobs채널을 종료합니다.
    이미, 작업용 고루틴의 동기화 처리에 대해서 알아보았었습니다.

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

$ go run closing-channels.go 
sent job 1
received job 1
sent job 2
received job 2
sent job 3
received job 3
sent all jobs
received all jobs

이 기법은 자연스럽게 다음장에서 다룰 range over channels를 이해하게 합니다.