타임아웃과 틱커
select와 함께 time.After 및 time.Tick 사용
타임아웃과 틱커은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
시간 초과가 중요한 이유
시간 초과가 없으면 느린 채널을 기다리는 고루틴이 영원히 차단될 수 있습니다. time 패키지는 채널 작업에 시간 기반 제어를 추가하는 기본 기능을 제공합니다.
일회성 시간 초과를 위한 time.After
time.After(d)는 d 기간이 지나면 값을 받는 채널을 반환합니다. 셀렉트 케이스에서 사용하면 대기를 중단할 수 있습니다.
select {
case res := <-ch:
fmt.Println(res)
case <-time.After(2 * time.Second):
fmt.Println("timed out")
}time.NewTimer로 시간 초과 반복하기
재사용 가능한 타이머에는 time.NewTimer를 사용하고 매번 사용한 후 Reset을 호출합니다. 타이머 고루틴의 누수를 방지하려면 Stop을 호출합니다.
timer := time.NewTimer(5 * time.Second)
defer timer.Stop()
select {
case <-timer.C:
fmt.Println("timer fired")
}time.Tick과 time.NewTicker 비교
time.Tick은 편리하지만 내부 틱커를 누수시킵니다. 리소스를 해제하기 위해 time.NewTicker를 사용하고 Stop()을 호출하는 편이 좋습니다.
ticker := time.NewTicker(500 * time.Millisecond)
defer ticker.Stop()
for range ticker.C {
fmt.Println("tick")
}반복문에서 틱커 사용하기
틱커를 완료 채널과 결합하면 주기적으로 작업을 수행하면서도 깔끔하게 중지할 수 있습니다.
ticker := time.NewTicker(time.Second)
done := make(chan struct{})
go func() {
for {
select {
case <-ticker.C:
doWork()
case <-done:
ticker.Stop()
return
}
}
}()time.After의 누수
time.After는 호출할 때마다 새 타이머를 만들며, 타이머가 실행될 때까지 가비지 컬렉션의 대상이 될 수 없습니다. 반복문이 매우 빠르게 실행되는 경우 타이머 누수를 피하려면 time.NewTimer와 Reset을 사용합니다.
기한과 시간 초과 비교
시간 초과는 상대적인 기간입니다("5초 동안 기다리기"). 기한은 절대적인 시각입니다("14:00까지 기다리기"). 기한을 time.After에서 사용할 기간으로 변환하려면 time.Until(deadline)을 사용합니다.
deadline := time.Now().Add(5 * time.Second)
select {
case v := <-ch:
use(v)
case <-time.After(time.Until(deadline)):
fmt.Println("deadline exceeded")
}context.WithTimeout을 사용하는 편이 좋습니다
HTTP 핸들러와 구조화된 작업에서는 원시 채널 시간 초과보다 context.WithTimeout을 사용하는 편이 좋습니다. 호출 스택 전체에 취소를 자동으로 전달하기 때문입니다.
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()Ticker로 속도 제한하기
틱커는 가장 간단한 속도 제한기입니다. 틱마다 요청 하나를 보냅니다. 버스트를 지원하려면 버퍼가 있는 채널을 미리 채우고 틱커로 다시 채웁니다.
requests := make(chan int, 5)
for i := 0; i < 5; i++ { requests <- i }
close(requests)
limiter := time.NewTicker(200 * time.Millisecond)
for req := range requests {
<-limiter.C
fmt.Println("request", req)
}단조 시계
Go의 타이머 기간은 실제 시계가 아니라 단조 시계를 사용하므로 시스템 시계 조정의 영향을 받지 않습니다. time.Since와 time.Until도 단조 시계를 사용합니다.
틱커를 올바르게 중지하기
ticker.Stop()을 호출해도 틱커 채널은 닫히지 않고, 더 이상 값을 받지 않게 될 뿐입니다. 필요하다면 반환하기 전에 채널에 남아 있는 값을 비웁니다.
빠른 확인
time.Tick보다 time.NewTicker를 사용하는 편이 좋은 이유는 무엇입니까?
복습: 시간 초과와 틱커
핵심 내용:
- 셀렉트에서 일회성 시간 초과에는 time.After를 사용합니다
- 반복 작업에는 time.NewTicker를 사용하고 항상 Stop()을 호출합니다
- 반복문에서는 time.After를 피합니다. 타이머가 누수됩니다
- 취소 가능한 작업에는 context.WithTimeout을 사용하는 편이 좋습니다
자주 묻는 질문
“타임아웃과 틱커” 강의는 무료인가요?
네 — “타임아웃과 틱커” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“타임아웃과 틱커”에서 뭘 배우나요?
select와 함께 time.After 및 time.Tick 사용 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Go Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“타임아웃과 틱커” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- select 문
- 타임아웃과 틱커
- 팬인과 팬아웃 패턴
- 워커 풀 패턴