golang - 주기적으로 실행하는 패턴
main에서는 아래와 같이 ctx를 만들어서 periodicLoop에 넘기고, 멈추고 싶을 때는 cancel()을 호출한다.
func main() {
...
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
go periodicLoop(ctx, 2*time.Second)
/* call cancel() to stop */
}
func doPeriodically(t time.Time) {
/* do something */
}
func periodicLoop(ctx context.Context, interval time.Duration) {
ticker := time.NewTicker(interval)
defer ticker.Stop()
doPeriodically(time.Now())
for {
select {
case <-ctx.Done():
return
case t := <-ticker.C:
doPeriodically(t)
}
}
}
이 글은 2018-12-13에 작성되었습니다.