我有一个项目需要在一天中的特定时间运行一个流程。 该函数的职责是查询数据库,构建一些聚合,并将它们记录到标准输出。 Go 中的内置时间库提供了一个ticker 函数,该函数接受输入持续时间并让您定期运行某些东西(函数)。 因为我打算在一天中的特定时间执行该功能并同时重复运行它,所以这不适合我的用例。
所以,这听起来像是我的 go 应用程序中需要的一个小 cron 东西。 从表面上看,该程序需要两个输入:小时和分钟。 顺便说一下,有许多调度程序库,例如 robfig/cron,也许还有更多。 不过,在这种情况下,我更喜欢编写自己的小程序。
首先,我需要一个函数,它需要两个输入小时和分钟,然后返回下一个可用时间。
func NextAvailableTime(hour, minute int) (time.Time, error) {
currentTime := time.Now().UTC()
newTime := time.Date(currentTime.Year(), currentTime.Month(), currentTime.Day(), hour, minute, 0, 0, time.UTC)
if newTime.Before(currentTime) {
newTime = newTime.Add(24 * time.Hour)
}
return newTime, nil
}
在这里,首先,我们获取当前时间,并在此基础上基于当前时间创建一个带有小时和分钟函数参数的 newTime 变量。 如果 newTime 在 currentTime 之前,我们添加 24 小时以使其合法。 例如,假设小时:13 和分钟:04,该函数将首先获取当前时间。 假设它是“2022–10–09 14:11:17.673879”,newTime 将是“2022–10–09 13:04:00”,但由于 currentTime 已经超过 newTime,我们调整 newTime 变量并添加 24 小时。
之后,我们需要一个函数来占用这个提供的时间并运行给定的函数。
func fnRunAt(t time.Time, fn func() error) error {
time.Sleep(time.Until(t))
return fn()
}
我们使用 inbuilttime.Sleep 暂停函数直到给定时间 t。 第二个函数参数是func() 错误,可以提供他们的函数来执行。
现在,在这两个函数的帮助下,我们可以在预定的时间运行我们选择的函数,但是我们如何每天都安排它呢?
func scheduler(hour, minute int, job func() error) {
for {
t, err := NextAvailableTime(hour, minute)
if err != nil {
log.Fatal(err)
}
err = fnRunAt(t, job)
if err != nil {
log.Fatal(err)
}
}
}
我们有一个无限循环,NextAvailableTime 函数允许我们确定下一个可接受的时间,然后我们将其传递给 fnRunAt 函数。
好吧,这就是我们在 Go 中做一些调度的小程序。 此外,尽管我们已经记住了如何自己进行调度,但仍有一些优秀的库具有用于调度作业的复杂 API。 如果需要复杂的调度,库将是一个很好的选择。
关注七爪网,获取更多APP/小程序/网站源码资源!
本文暂时没有评论,来添加一个吧(●'◡'●)