Использование Gin Gonic и некоторого планировщика в Golang
У меня есть служба REST в Gin Gonic, и мне нужно выполнять какую-то работу каждые 5 секунд, используя какой-то планировщик. я пробовал rakanalh
а также gocron
но кажется, что каждый код, написанный после инициализации cron или джина, не будет выполнен.
func main() {
settings.AppSettings = settings.ReadSettings()
db.InitOracleDataBase()
OracleEnv, OracleSrv, OracleSes := db.GetOracleDB()
defer OracleEnv.Close()
defer OracleSrv.Close()
defer OracleSes.Close()
routes.Init()
gocron.Every(5).Seconds().Do(prOk)
<-gocron.Start()
}
prOk просто печатает ОК, и он никогда не будет выполнен, пока я не прокомментирую routes.init()
, Как можно одновременно выполнять маршруты cron и gin?
2 ответа
Вы должны выполнить gocron внутри goroutine, так как основной goroutine будет блокировать (я думаю, routes.Init()
тоже запускает HTTP-сервер?)
func main() {
settings.AppSettings = settings.ReadSettings()
db.InitOracleDataBase()
OracleEnv, OracleSrv, OracleSes := db.GetOracleDB()
defer OracleEnv.Close()
defer OracleSrv.Close()
defer OracleSes.Close()
go func() {
gocron.Every(5).Seconds().Do(prOk)
<-gocron.Start()
}()
routes.Init()
}
Я делаю нечто подобное, где я кеширую некоторые результаты API и обновляю кеш каждые несколько секунд. Я не использую ничего кроме стандартной библиотеки, хотя. Вот пример кода.
func UpdateCache() {
var lock sync.Mutex
timer1 := time.NewTicker(time.Second * 10)
defer timer1.Stop()
timer2 := time.NewTicker(time.Second * 5)
defer timer2.Stop()
for {
/* run forever */
select {
case <-timer1.C:
go func() {
lock.Lock()
defer lock.Unlock()
/* do things I need done every 10 seconds */
}()
case <-timer2.C:
go func() {
lock.Lock()
defer lock.Unlock()
/* do things I need done every 5 seconds */
}()
}
}
}
И в основном () у меня есть
go UpdateCache()
router := gin.Default()
/* setup all the routes */
listen := os.Getenv("SERVICE_ADDR")
router.Run(listen)
Я думаю, что проблема, с которой вы сталкиваетесь, заключается в том, что вы начинаете запускать свои маршруты в маршрутах.Init() блокирует их и никогда не попадает в настройки cron.