当前位置:网站首页>The golang timer uses the stepped pit: the timer is executed once a day
The golang timer uses the stepped pit: the timer is executed once a day
2022-07-05 07:17:00 【java_ xxxx】
golang The timer uses a stepping pit
Project background and problems
There is such a requirement in the project , You need to use a timer every morning 10:00:00 Handle some business logic , But I met 2 A question .
Bubibi , Code up
go func() {
for {
now := time.Now()
var next time.Time
// Every day 10:00 On Tao with Su Shi
if now.Hour() < 10 || now.Hour() == 10 {
next = now
} else {
next = now.Add(time.Hour * 24)
}
// Every day 10:00 On Tao with Su Shi
next = time.Date(next.Year(), next.Month(), next.Day(), 10, 0, 0, 0, next.Location())
// The fixed time has passed , Prevent project restart , Trigger the timer again . Such as 10 Click to execute once ,10:10 Restart the service , At this time, it is set to execute on the next day
logger.Info("UpdateOndutys Now=%s Next=%s", now, next)
timer := time.NewTimer(next.Sub(now))
select {
case ts := <-timer.C:
// go function() // Business logic
logger.Info("Start UpdateOnduty_7day ts=%s", ts.String())
time.Sleep(120 * time.Second)
timer.Stop()
}
}
}()
problem 1:golang One feature of the timer is that you set an expiration time, and it will still execute , such as , It's morning now 10:00:00, Then I set the timer today 9:00:00 To carry out , It will still execute .
problem 2: If the timer is in the morning 10:00:00 perform , Then I 10:44:44 Project restarted , Then it executes again , But requirements are implemented only once a day .
Solution
Before we start the timer, judge the current time and the execution time of the timer , If the current time is greater than the timer execution time , It indicates that the timer has been executed , Then set it to execute tomorrow . If the current time is less than the timer time, the timer has not been executed , Follow the normal logic today .
go func() {
for {
now := time.Now()
var next time.Time
// Every day 10:00 On Tao with Su Shi
if now.Hour() < 10 || now.Hour() == 10 {
next = now
} else {
next = now.Add(time.Hour * 24)
}
// Every day 10:00 On Tao with Su Shi
next = time.Date(next.Year(), next.Month(), next.Day(), 10, 0, 0, 0, next.Location())
// The fixed time has passed , Prevent project restart , Trigger the timer again . Such as 10 Click to execute once ,10:10 Restart the service , At this time, it is set to execute on the next day
if now.Unix() > next.Unix() {
next = now.Add(time.Hour * 24)
next = time.Date(next.Year(), next.Month(), next.Day(), 10, 0, 0, 0, next.Location())
}
logger.Info("UpdateOndutys Now=%s Next=%s", now, next)
timer := time.NewTimer(next.Sub(now))
select {
case ts := <-timer.C:
// go function() // Business logic
logger.Info("Start UpdateOnduty_7day ts=%s", ts.String())
time.Sleep(120 * time.Second)
timer.Stop()
}
}
}()
边栏推荐
- Ros2 - node (VII)
- 并发编程 — 如何中断/停止一个运行中的线程?
- 1290_ Implementation analysis of prvtaskistasksuspended() interface in FreeRTOS
- SOC_ SD_ DATA_ FSM
- Executealways of unity is replacing executeineditmode
- C learning notes
- Typescript get timestamp
- Target detection series - detailed explanation of the principle of fast r-cnn
- Ros2 topic (VIII)
- Chapter 2: try to implement a simple bean container
猜你喜欢
Ros2 - Service Service (IX)
iNFTnews | 喝茶送虚拟股票?浅析奈雪的茶“发币”
Intelligent target detection 59 -- detailed explanation of pytoch focal loss and its implementation in yolov4
SOC_SD_CMD_FSM
逻辑结构与物理结构
SD_ CMD_ RECEIVE_ SHIFT_ REGISTER
An article was opened to test the real situation of outsourcing companies
ROS2——topic话题(八)
你心目中的数据分析 Top 1 选 Pandas 还是选 SQL?
[vscode] prohibit the pylance plug-in from automatically adding import
随机推荐
Spinningup drawing curve
Docker installs MySQL and uses Navicat to connect
PostMessage communication
Jenkins reported an error. Illegal character: '\ufeff'. Class, interface or enum are required
Three body goal management notes
Unity UGUI不同的UI面板或者UI之间如何进行坐标匹配和变换
Energy conservation and creating energy gap
Mathematical analysis_ Notes_ Chapter 8: multiple integral
乐鑫面试流程
ModuleNotFoundError: No module named ‘picamera‘
C learning notes
Logical structure and physical structure
氢氧化钠是什么?
基于FPGA的一维卷积神经网络CNN的实现(八)激活层实现
Database SQL practice 3. Find the current salary details of the current leaders of each department and their corresponding department number Dept_ no
Import CV2 prompt importerror: libgl so. 1: Cannot open shared object file: no such file or directory
Ros2 - function package (VI)
The difference between NPM install -g/-save/-save-dev
[software testing] 03 -- overview of software testing
【Node】npm、yarn、pnpm 区别