golang 定时任务 队列

发布时间:2024-07-03 07:25:22

开发一个定时任务队列是 Golang 中的一个常见需求。无论是发送邮件、生成报表、清理系统日志,还是其他需要定期执行的任务,都可以使用定时任务队列来实现。

1. 定义定时任务结构

Golang 中可以使用 Goroutine 和 Channel 的组合来实现定时任务队列。首先,我们需要定义一个结构体来表示每个定时任务的信息,包括任务名称、执行时间间隔等。

例如,我们定义一个名为 Task 的结构体:

type Task struct {
    name          string    // 任务名称
    interval      int       // 执行间隔,单位为秒
    lastExecution time.Time // 上次执行时间
}

2. 创建任务队列

接下来,我们需要创建一个任务队列来存储所有的定时任务。可以使用切片来实现这个队列。

例如,我们定义一个名为 TaskQueue 的结构体:

type TaskQueue struct {
    tasks []*Task // 任务列表
    done  chan bool
    lock  sync.Mutex
}

然后,我们可以通过 AddTask() 方法将任务添加到队列中:

func (tq *TaskQueue) AddTask(task *Task) {
    tq.lock.Lock()
    defer tq.lock.Unlock()
    tq.tasks = append(tq.tasks, task)
}

3. 执行定时任务

最后,我们需要使用 Goroutine 和 Channel 来执行定时任务。具体的实现方法是使用一个无限循环,在每一次循环中检查当前时间是否满足任务执行条件,如果满足就执行任务。

例如,我们可以定义一个名为 Run() 的方法:

func (tq *TaskQueue) Run() {
    ticker := time.NewTicker(1 * time.Second) // 定义一个 1 秒的定时器
    defer ticker.Stop()
    for {
        select {
        case <-ticker.C:
            for _, task := range tq.tasks {
                if task.lastExecution.IsZero() || time.Since(task.lastExecution).Seconds() > float64(task.interval) {
                    go task.Execute()
                    task.lastExecution = time.Now()
                }
            }
        case <-tq.done:
            return
        }

    }
}

通过以上三个步骤,我们就可以创建一个简单的定时任务队列了。开发者可以根据实际需求,进一步完善任务队列的功能和性能。

相关推荐