2012년 4월 29일 일요일

go chan select



goroutine, channel 과 함께 한 팀을 이루고있는
select 문을 한번 보자.


ch 에 데이터가 들어오기를 기다린다.
그런데, 계속기다리는것이 아니라, 일정시간동안(timeout )만 기다린다.

아래 코드에는 ch 에 데이터를 쓰는 부분이 없지만,
실제 코드 실행중에는 ch 에 데이터가 먼저들어올지,
timeout 이 먼저 발생할지, 알수없는 상황이라고 가정해보자.

사건발생의 임의성을 select 문으로 깔끔하게 묶어냈다.




package main


import "fmt"
import "time"


func main() {


ch := make( chan int)
timeout := make( chan bool, 1)


go func() {
time.Sleep( 1 * time.Second)
timeout <- true
} ()

select {
case <-ch:
fmt.Println("read from ch.")
case <-timeout:
fmt.Println("timeout.")
}


}


코드 출처: http://golang.org/doc/articles/concurrency_patterns.html