为了账号安全,请及时绑定邮箱和手机立即绑定

我必须发送数千条提醒,有什么办法可以避免每分钟都被提醒?

我必须发送数千条提醒,有什么办法可以避免每分钟都被提醒?

Go
慕哥9229398 2023-05-08 15:03:18
我有一个像这样的结构:type Notifications struct {  Id int  Start *time.Time}notifications := db.GetNotifications()所以现在我需要在时间与当前时间匹配时发送这些通知。1  2018-11-07 09:05:002  2018-11-07 09:05:003  2018-11-07 09:15:00..对我来说,最简单的方法是使用自动收报机:ticker := time.NewTicker(30 * time.Second)defer ticker.Stop()for {    <-ticker.C    alerts := []Notification    for _, n := range notifications {      if n.Start == // same year, month, day, hour and minute {        alerts = append(alerts, n)       }    }    sendNotifications(alerts)    // TODO mutate the notifications to avoid duplicatation sending}有没有更有效的方法来做到这一点?匹配时间的最佳方法是什么,我是否必须在我的 if 语句中分别比较 time.Now() 的属性,如年、月、日、小时和分钟?即,如果已达到年、月、日、小时和分钟(忽略秒及以后),则会触发通知
查看完整描述

1 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

首先,要比较时间值,请使用Time.Equal、Time.Before和time.After方法。比较各个组件根本不可靠:

newYork, _ := time.LoadLocation("America/New_York")


t1 := time.Date(2018, 11, 8, 4, 0, 0, 0, time.UTC)

t2 := t1.In(newYork)


fmt.Printf("%v == %v?\n", t1, t2) // 2018-11-08 04:00:00 +0000 UTC == 2018-11-07 23:00:00 -0500 EST?


fmt.Println(t1.Day() == t2.Day()) // false

fmt.Println(t2.Equal(t1))         // true

https://play.golang.org/p/06RcvuI_1Ha


对于调度问题,我会使用time.Timer。

  1. 找出下一个通知

  2. 相应地设置或重置定时器


    1. 计时器触发后,转到 1

    2. 如果添加通知,转到1

    3. 如果通知被删除,转到1

这是一个草图:

package main


import "time"


func main() {

    t := time.NewTimer(0)


    go func() {

        for range t.C {

            nextTwo := db.GetNextNotifications(2)


            // Sanity check

            if time.Until(nextTwo[0].Start) > 1*time.Second {

                // The timer went off early. Perhaps the notification has been

                // deleted?

                t.Reset(time.Until(nextTwo[0].Start))

                continue

            }


            go send(nextTwo[0])

            t.Reset(time.Until(nextTwo[1].Start))

        }

    }()


    resetTimer(t) // call as required whenever a notification is added or removed

}


func resetTimer(t *time.Timer) {

    next := db.GetNextNotification()

    t.Reset(time.Until(next.Start))

}


查看完整回答
反对 回复 2023-05-08
  • 1 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信