.

time.Ticker ๋๋ time.AfterFunc, time.Sleep ๋ฑ์ ์ด์ฉํด ์ฃผ๊ธฐ์ ์ผ๋ก ๋์ํ๋ ์ค์ผ์ค๋ฌ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
์๋์์๋ ์ค๋ฌด์์ ์์ฃผ ์ฐ์ด๋ n์ด ๊ฐ๊ฒฉ์ผ๋ก ๋ฐ๋ณต ์คํ๋๋ ์์
ํ๋ก์ธ์ค๋ฅผ ๋จ๊ณ์ ์ผ๋ก ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
๊ธฐ๋ณธ์ ์ธ time.Ticker ์ฌ์ฉ ์์
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(5 * time.Second) // 5์ด๋ง๋ค ๋ฐ๋ณต
defer ticker.Stop()
for {
select {
case t := <-ticker.C:
fmt.Println("์์
์คํ ์๊ฐ:", t.Format("15:04:05"))
runTask()
}
}
}
func runTask() {
// ์ค์ ๋น์ฆ๋์ค ๋ก์ง
fmt.Println("์คํ ์ค... (API ํธ์ถ, DB ์
๋ฐ์ดํธ ๋ฑ)")
}
ํต์ฌ ํฌ์ธํธ
- time.NewTicker(d)๋ ์ผ์ ์ฃผ๊ธฐ๋ก ์ฑ๋์ ์ด๋ฒคํธ๋ฅผ ๋ณด๋ ๋๋ค.
- for + select ๊ตฌ๋ฌธ์ผ๋ก ์ฃผ๊ธฐ์ ์ ํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉฐ ์คํํฉ๋๋ค.
- defer ticker.Stop()์ผ๋ก ์ข ๋ฃ ์ ๋ฆฌ์์ค ํด์ .
๋ฐฑ๊ทธ๋ผ์ด๋ ๊ณ ๋ฃจํด์์ ์คํ (์๋ฒ ๋ด๋ถ์ฉ)
package main
import (
"fmt"
"time"
)
func startScheduler(interval time.Duration, stopChan <-chan struct{}) {
ticker := time.NewTicker(interval)
defer ticker.Stop()
for {
select {
case <-ticker.C:
go func() {
fmt.Println("๋ฐฑ๊ทธ๋ผ์ด๋ ์์
์์:", time.Now())
runTask()
}()
case <-stopChan:
fmt.Println("์ค์ผ์ค๋ฌ ์ข
๋ฃ ์์ฒญ")
return
}
}
}
func runTask() {
fmt.Println("์์
์ํ ์ค...")
time.Sleep(2 * time.Second)
fmt.Println("์์
์๋ฃ.")
}
func main() {
stopChan := make(chan struct{})
go startScheduler(10*time.Second, stopChan)
// ์๋ฒ๊ฐ ๋์๊ฐ๋ ๋์ ๊ณ์ ์คํ๋จ
time.Sleep(35 * time.Second)
close(stopChan)
}
ํน์ง
- ์ค์ผ์ค ์์ ์ด ๊ณ ๋ฃจํด์ผ๋ก ๋น๋๊ธฐ ์คํ๋์ด, ๋ค์ ์ฃผ๊ธฐ์ ๊ฒน์น์ง ์์ต๋๋ค.
- stopChan์ ํตํด graceful stop์ด ๊ฐ๋ฅํฉ๋๋ค.
3๋จ๊ณ: ๊ณ ๊ธํ (์ง์ฐ, ์ค๋ฅ ๋ณต๊ตฌ ํฌํจ)
์ค๋ฌด์์๋ ์์ ์ด ์คํจํ์ ๋ ์ฌ์๋ ๋ก์ง์ ๋ฃ๊ฑฐ๋, ์์ ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ฉด ๋ค์ ์ฃผ๊ธฐ๋ฅผ ์ง์ฐ์ํค๋ ๊ตฌ์กฐ๊ฐ ํ์ํฉ๋๋ค.
func startSafeScheduler(interval time.Duration, stopChan <-chan struct{}) {
ticker := time.NewTicker(interval)
defer ticker.Stop()
for {
select {
case <-ticker.C:
func() {
defer func() {
if r := recover(); r != nil {
fmt.Println("์์
์ค panic ๋ฐ์:", r)
}
}()
if err := runTask(); err != nil {
fmt.Println("์๋ฌ:", err)
}
}()
case <-stopChan:
fmt.Println("์ค์ผ์ค๋ฌ ์ข
๋ฃ")
return
}
}
}
func runTask() error {
fmt.Println("DB ์
๋ฐ์ดํธ ๋๋ API ํธ์ถ ์ค...")
// ์ฌ๊ธฐ์ ์ค์ ๋ก์ง
return nil
}
์ด ๋ฐฉ์์:
- panic ๋ฐ์ ์ ๋ณต๊ตฌ ๊ฐ๋ฅ
- ๋ค์ ์ฃผ๊ธฐ์ ๊ฒน์น์ง ์์
- ์คํจํ ์์ ๋ก๊ทธ ๋จ๊น
๋์ฒด ๋ฐฉ์ – Cron ์คํ์ผ (github.com/robfig/cron/v3)
๋ ๋ณต์กํ ์ค์ผ์ค์ด ํ์ํ ๋๋ cron ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
import (
"github.com/robfig/cron/v3"
)
func main() {
c := cron.New()
c.AddFunc("@every 10s", func() { runTask() })
c.Start()
select {} // ํ๋ก๊ทธ๋จ ์ ์ง
}
@every 10s, 0 0 * * * ๋ฑ ๋ค์ํ ์ค์ผ์ค ํํ ๊ฐ๋ฅํฉ๋๋ค.
'ํ๋ก๊ทธ๋๋ฐ ์ธ์ด > Go' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Go] enum ์ฌ์ฉํ๊ธฐ (0) | 2025.11.10 |
|---|---|
| [Go] ์ค๋ฌด ํ๊ฒฝ์์ ๋ก๊ทธ ์ ๋๋ก ๋จ๊ธฐ๊ธฐ(Logging) (0) | 2025.11.10 |
| [Go] ํ์์ง์ ์ Format ์ ๋ฆฌ(%v,%s,%d ๋ฑ) (0) | 2025.11.07 |
| [Go] Map ์๋ฆฌ์ ํ์ฉ(feat. hash) (0) | 2025.11.05 |
| [Go] ์ฌ๋ผ์ด์ค(slice)์๋ ํฌ์ธํฐ๊ฐ ์๋ค (0) | 2025.10.14 |
๋๊ธ