Go by Example: [28] Timeouts
Timeouts
Timeouts
은 외부자원에 접근하거나 특정시간을 대기할 경우에 중요하게 사용됩니다.
Go
언어에서 Timeouts
은 select
와 channel
을 이용해서 쉽고 우아하게 구현할 수 있습니다.
package main
import "fmt"
import "time"
func main() {
c1 := make(chan string, 1) // [1]
go func() {
time.Sleep(time.Second * 2)
c1 <- "result 1"
}()
select { // [2]
case res := <-c1:
fmt.Println(res)
case <-time.After(time.Second * 1):
fmt.Println("timeout 1")
}
c2 := make(chan string, 1) // [3]
go func() {
time.Sleep(time.Second * 2)
c2 <- "result 2"
}()
select {
case res := <-c2:
fmt.Println(res)
case <-time.After(time.Second * 3):
fmt.Println("timeout 2")
}
}
- 예제에서는
c1
채널에 2초의 시간을 두고 메세지를 전송하고 있습니다. select
구문을 이용해서timeout
을 구현하고 있습니다.res := <-c1
구문은 결과가 정상적으로
올때 출력하고,<-time.After()
1초 후에는 타임아웃을 발생시키는 문장입니다.
둘다 채널에서 정상적으로 메세지를 받으면 아무 문제없게 출력하고, 1초 후가 되도록 메세지를
수신하지 못한다면timeout
케이스가 작동하게 되는 원리 입니다.- 3초의
timeout
값을 설정한 경우 입니다. c2채널에서 정상적으로 메세지를 받으면 출력합니다.
실행하면 다음과 같습니다.
$ go run timeouts.go
timeout 1
result 2
상기 프로그램을 실해하면 첫번째 작업은 시간제한(timeout
)이 발생하고, 두번째 작업은 성공했습니다.
select
문을 이용한 시간제한(timeout
)기법은 채널 통신중에 자주 사용하는 패턴중 하나입니다.
Go
언어에서 채널 통신을 쉽고 강력하게 해주는 것이 바로 이런 기능입니다.
다음장에서는 timer
& tickers
예제를 통해서 이 기능에 대해서 설명하겠습니다.