0Pricing
Go Academy · 강의

타임아웃과 틱커

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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. select 문
  2. 타임아웃과 틱커
  3. 팬인과 팬아웃 패턴
  4. 워커 풀 패턴
← Go Academy(으)로 돌아가기