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]
}
- 예제에서는
main()
함수 고루틴에서 작업 고루틴으로jobs
채널을을 이용해서 통신하고 있습니다.
더이상 작업 고루틴에서 작업을 하지 않는다면jobs
채널을close
하여 종료 처리를 합니다. - 작업 고루틴입니다.
jobs
채널에서 계속적으로 (j
만큼)more := <- jobs
메세지를 수신합니다.
만약more
값이 거짓이면 채널에서 모든값을 수신한 것이며jobs
채널을 닫습니다.
done
채널값은 참/거짓을 기준으로 모든 메세지를 수신한 것인지를 알아내고 있습니다. - 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
를 이해하게 합니다.