채널 타임아웃 기능

채널 타임아웃

복수 (혹은 단수) 채널을 기다리고 있을 때, Timeout 기능을 넣어야 하는 경우가 있을 수 있다. 이때 아래 예제와 같이 time.After()를 사용하여 타임아웃 채널을 만든 후, 이를 select 문에 추가하면 지정된 시간이 경과한 후 타임아웃하는 기능을 쉽게 구현할 수 있다.

package main

import "time"

func main() {
	ch1 := make(chan bool)
	ch2 := make(chan bool)

	go func(done chan bool) {
		time.Sleep(5 * time.Second)
		done <- true
	}(ch1)

	go func(done chan bool) {
		time.Sleep(10 * time.Second)
		done <- true
	}(ch2)

	// time.After()는 입력파라미터에 지정된 시간이
	// 지나면 Ready되는 채널을 리턴한다
	timeoutChan := time.After(1 * time.Second)

	select {
	case <-ch1:
		println("run1")

	case <-ch2:
		println("run2")

	// select 문 내에서 타임아웃 체크
	case <-timeoutChan:
		println("timeout")
	}
}