Go 타이머에 대한 이해: Timer와 Ticker 사용
Olivia Novak
Dev Intern · Leapcell

Key Takeaways
- Go의
Timer
는 단일 이벤트 지연에 사용되는 반면,Ticker
는 반복 실행에 사용됩니다. - 타이머와 티커는 더 이상 필요하지 않을 때 중지하여 리소스 누수를 방지해야 합니다.
- 타이머 채널의 적절한 처리는 동시 애플리케이션에서 고루틴 누수를 방지합니다.
Go에서 타이머는 특정 기간 후에 또는 일정한 간격으로 실행해야 하는 작업을 관리하는 데 필수적입니다. time
패키지는 두 가지 주요 유형인 Timer
와 Ticker
를 제공합니다.
Timer
Timer
는 지정된 기간 후에 채널에 현재 시간을 보내는 단일 이벤트를 나타냅니다.
package main import ( "fmt" "time" ) func main() { // 타이머를 2초로 설정합니다. // 지정된 시간이 지나면 타이머 채널에 현재 시간이 전송됩니다. // 그런 다음 <-timer.C는 값을 수신할 때까지 차단됩니다. // 따라서 프로그램은 타이머가 만료될 때까지 일시 중지됩니다. // 타이머는 한 번만 실행되도록 설계되었습니다. // time.Sleep을 사용하여 타이머를 시작하지 않고 동일한 작업을 직접 수행할 수 있습니다. // time.Sleep(2 * time.Second) // 그러나 타이머가 유용한 이유는 만료되기 전에 중지할 수 있기 때문입니다. // 타이머에 WaitFor를 호출할 수 없는 이유는 타이머에 WaitFor가 없기 때문입니다. // 타이머는 채널이고 채널에서 읽습니다. // 이 채널에서 읽는 것은 차단 작업이므로 WaitFor입니다. fmt.Println("Timer started") // NewTimer는 타이머와 채널 C를 반환합니다. // C에 무언가를 보내고 타이머가 만료되었음을 알립니다. fmt.Println("Timer object", time.NewTimer(2*time.Second)) // 채널에 쓸 준비가 되면 타이머 채널을 통해 시간 값을 보냅니다. //타이머 객체입니다. // &{844994240 [0 0] } // 채널 객체입니다. // (0x14000118180) // Timer struct { // contains filtered or unexported fields } // Field C chan Time // timer 안에 C라는 채널이 있습니까? // 예 // 이제 이 채널에서 읽을 것입니다. // 타이머는 시간이 지남에 따라 C 채널에 타임스탬프를 보냅니다. // 채널은 <- 연산자를 사용하여 읽어옵니다. // 화살표는 화살표가 가리키는 곳에서 읽기를 의미합니다. // 채널에서 읽기입니다. // 이 채널은 차단 채널입니다. // 읽을 때까지 기다립니다. // 읽을 때까지 다음 줄로 진행하지 않습니다. // 이 시나리오에서는 2초 동안 기다란 다음 타이머가 만료되면 채널에 값을 보냅니다. timer := time.NewTimer(2 * time.Second) <-timer.C fmt.Println("Timer expired") }
이 예에서는 Timer
가 2초로 설정됩니다. 프로그램은 C
채널에서 수신하기 위해 대기하고 타이머가 만료되면 차단 해제됩니다.
타이머가 만료되기 전에 중지하려면 Stop
메서드를 사용하십시오.
if timer.Stop() { fmt.Println("Timer stopped") }
Ticker
Ticker
는 일정한 간격으로 채널에 현재 시간을 제공합니다.
package main import ( "fmt" "time" ) func main() { // 매초 틱에 대한 채널을 생성합니다. // Ticker struct { // contains filtered or unexported fields } // Field C chan Time // 틱커의 채널입니다. // 틱커는 시간이 지남에 따라 Ticker.C에 타임스탬프를 보냅니다. // 이 채널은 차단 채널이어야 합니까? // 예, select 문에서 읽기 때문입니다. // 채널에서 읽을 때 채널에 값이 있을 때까지 기다립니다. // select 문을 사용하여 수행할 작업이 있는지 확인합니다. ticker := time.NewTicker(1 * time.Second) done := make(chan bool) go func() { // 이 고루틴은 5초 동안 잠자도록 설정합니다. // 그런 다음 주 함수로 신호를 보냅니다. 5초가 지났습니다. // 그리고 함수를 종료합니다. 아래에서 tickers.Stop을 호출해야 합니다. time.Sleep(5 * time.Second) done <- true }() for { select { case t := <-ticker.C: fmt.Println("Tick at", t) case <-done: ticker.Stop() fmt.Println("Ticker stopped") return } } }
여기서 Ticker
는 매초마다 틱합니다. 5초 후 done
채널은 티커를 중지하도록 신호를 보냅니다.
기본 구현
Timer
와 Ticker
는 모두 타이밍 이벤트를 효율적으로 관리하는 Go의 런타임 timer
구조를 활용합니다. runtimeTimer
구조에는 when
(이벤트가 발생해야 하는 시간) 및 period
(반복 이벤트)와 같은 필드가 포함됩니다. startTimer
, stopTimer
및 resetTimer
와 같은 함수는 이러한 타이머를 제어합니다. 더 자세한 내용은 Go 소스 코드 및 관련 토론을 참조하십시오.
모범 사례
-
리소스 관리: 리소스를 해제하기 위해 더 이상 필요하지 않은 경우 항상 타이머와 티커를 중지하십시오.
-
채널 작업: 고루틴 누수를 방지하기 위해 채널 작업에 주의하십시오. 타이머 채널을 수신하는 고루틴이 적절하게 종료될 수 있는지 확인하십시오.
Timer
와 Ticker
를 효과적으로 활용함으로써 Go 개발자는 시간 종속적 작업을 정밀하고 효율적으로 처리할 수 있습니다.
FAQs
Timer
는 지연 후 한 번 실행되는 반면, Ticker
는 고정된 간격으로 반복됩니다.
Stop()
을 사용하여 실행을 중단하고 리소스를 해제합니다.
부적절하게 처리하면 고루틴이 차단되고 메모리 누수가 발생할 수 있습니다.
Go 프로젝트 호스팅을 위한 최고의 선택, Leapcell입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하십시오.
무제한 프로젝트를 무료로 배포
- 사용량에 대해서만 지불하십시오. 요청이 없고 요금이 없습니다.
탁월한 비용 효율성
- 유휴 요금 없이 사용한 만큼만 지불하십시오.
- 예: 25달러는 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI.
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅.
손쉬운 확장성 및 고성능
- 손쉽게 높은 동시성을 처리하도록 자동 확장됩니다.
- 운영 오버헤드가 없으므로 구축에만 집중하십시오.
설명서에서 더 자세히 알아보십시오!
X에서 저희를 팔로우하세요: @LeapcellHQ