### 请大家帮忙看看一个定时器的问题,谢谢。
#### 问题描述:
在win10下测试正常,在win10的linux子系统下测试正常,在centos7服务器上异常,问题表现为除了按照指定时间执行外,还在之前的几秒钟执行一次,时间不固定。
#### 代码如下:
```golang
package main
import (
"io/ioutil"
"log"
"net/http"
"os"
"runtime"
"strconv"
"time"
)
var fileloger *log.Logger
var logFile *os.File
func initLogger() {
file := "./logs/" + time.Now().Format("20060102") + ".log"
var err error
logFile, err = os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0766)
//defer logFile.Close()
if err != nil {
panic(err)
}
fileloger = log.New(logFile, "", log.LUTC) // 将文件设置为loger作为输出
return
}
func CreatLogger() {
initLogger()
for {
now := time.Now() //获取当前时间,放到now里面,要给next用
next := now.Add(time.Hour * 24) //通过now偏移24小时
next = time.Date(next.Year(), next.Month(), next.Day(), 0, 0, 0, 0, next.Location()) //获取下一个凌晨的日期
t := time.NewTimer(next.Sub(now)) //计算当前时间到凌晨的时间间隔,设置一个定时器
<-t.C
log.Println(time.Now(), "创建一个文件")
logFile.Close()
t.Stop()
//以下为定时执行的操作
initLogger()
}
}
func searchHandler(w http.ResponseWriter, r *http.Request) {
fileloger.Println(string(body))
w.Write([]byte(strconv.Itoa(runtime.NumGoroutine())))
}
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
go CreatLogger()
http.HandleFunc("/search", searchHandler)
log.Println("Server start listen on port:", 18080)
err := http.ListenAndServe(":18080", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err.Error())
}
}
```
#### 日志如下:
2020/10/09 14:48:52 Server start listen on port: 18080
2020/10/09 23:59:57 2020-10-09 23:59:57.197181062 +0800 CST m=+33067.952413287 创建一个文件
2020/10/10 00:00:00 2020-10-10 00:00:00.00015083 +0800 CST m=+33070.755383073 创建一个文件
2020/10/10 23:59:52 2020-10-10 23:59:52.519040092 +0800 CST m=+119470.755332920 创建一个文件
2020/10/11 00:00:00 2020-10-11 00:00:00.000123355 +0800 CST m=+119478.236416191 创建一个文件
2020/10/11 23:59:58 2020-10-11 23:59:58.635823011 +0800 CST m=+205878.236415904 创建一个文件
2020/10/12 00:00:00 2020-10-12 00:00:00.000176828 +0800 CST m=+205879.600769738 创建一个文件
有疑问加站长微信联系(非本文作者))