提示:go语言实现一个定时下载任务,多线程。
它通过一个无限循环,在每次循环中等待到下一整半点,然后创建一个新的定时器和一个新的 goroutine 来执行下载任务。下载任务会在每天的整点开始,每 15 分钟下载一次,共循环 4 次。
func (api *main) scheduleDownload() {
start := false //初始化一个名为start的变量为false,用于标记下载任务的开始状态。
// 定时器逻辑
for {//启动一个无限循环,使下载任务能够持续执行。
now := time.Now() //获取当前的本地时间。
nextHalfHour := now.Truncate(time.Hour).Add(30 * time.Minute) //计算下一个半小时的时间。
//fmt.Printf("下一个半小时: %v\n", nextHalfHour)
waitTime := nextHalfHour.Sub(now)
//fmt.Println("等待时间: ", waitTime)
time.Sleep(waitTime)
// 时间到了之后的执行的操作
log.Println("开始下载...")//当等待到下一整半点时,打印一条日志信息。
// 创建一个 ticker,每 30 分钟触发一次
ticker := time.NewTicker(30 * time.Minute)//创建一个新的定时器对象ticker,设置间隔时间为 30 分钟。
//fmt.Println("定时器创建成功")
// 启动一个新的 goroutine 来等待并执行下载任务
func() { //创建了一个匿名函数,并立即在一个新的goroutine里启动它。这个函数包含下载任务的逻辑。
defer ticker.Stop() //确保在执行完任务后,定时器资源能被正确地清理。
// 等待定时器触发
<-ticker.C //使用通道C接收time.Ticker的触发信号,本质是阻塞等待,直到定时器时间到了。
// 时间到了之后的执行的操作
log.Println("开始下载1...")
// 开始下载任务
if start { //检查start标志,如果为true,则开始下载任务。
now := time.Now().Truncate(24 * time.Hour)
//fmt.Println("当前时间:", now)
// 整点时间
hourStart := now.Truncate(time.Hour)
//fmt.Println("整点时间:", hourStart)
// 循环两次
for i := 0; i < 4; i++ {
// 计算每个时间间隔的时间字符串
timeString := hourStart.Add(time.Minute * time.Duration(15*i)).Format("20060102150400000")
//fmt.Println("timeString: ", timeString)
//log.Println("开始下载2: ", timeString)
// 调用下载函数
downloadImage(timeString + ".jpg") //根据计算得到的时间字符串拼接成文件名,然后调用实际下载自己需要的函数。
}
}
}()
start = true
}
}