Go でタスクスケジューリングフレームワークを実装する方法

Golangジョブスケジューラフレームワークを実装するには、次の手順に従ってください。

  1. まずタスクの属性(タスクID、名称、実行時間、実行周期など)を格納するタスク構造体を定義します。
type Task struct {
    ID       int
    Name     string
    Time     time.Time
    Interval time.Duration
}
  1. タスクスケジューラを作成: タスクをすべて管理するタスクスケジューラ構造を作成します。
type Scheduler struct {
    tasks []*Task
}
  1. タスク追加:ユーザーがタスクをスケジューラーに追加できるようにする手段を提供する。
func (s *Scheduler) AddTask(task *Task) {
    s.tasks = append(s.tasks, task)
}
  1. スケジューラを起動: タスクマネージャーを起動するメソッドを作成します。このメソッドは、タスクの実行時間と周期に従ってタスクを定期的に実行します。
func (s *Scheduler) Start() {
    for {
        for _, task := range s.tasks {
            if time.Now().After(task.Time) {
                go func(t *Task) {
                    // 执行任务的逻辑
                    // ...
                }(task)
                if task.Interval > 0 {
                    task.Time = time.Now().Add(task.Interval)
                } else {
                    // 如果任务不是周期性执行的,从调度器中移除该任务
                    s.RemoveTask(task)
                }
            }
        }
        time.Sleep(1 * time.Second)
    }
}
  1. タスクの削除: ユーザーがスケジューラーから特定のタスクを削除できるメソッドを提供します。
func (s *Scheduler) RemoveTask(task *Task) {
    for i, t := range s.tasks {
        if t.ID == task.ID {
            s.tasks = append(s.tasks[:i], s.tasks[i+1:]...)
            break
        }
    }
}
  1. 使用例:
func main() {
    scheduler := &Scheduler{}
    
    // 添加任务
    task1 := &Task{
        ID:       1,
        Name:     "task1",
        Time:     time.Now().Add(5 * time.Second), // 5秒后执行
        Interval: 0, // 只执行一次
    }
    scheduler.AddTask(task1)
    
    task2 := &Task{
        ID:       2,
        Name:     "task2",
        Time:     time.Now().Add(10 * time.Second), // 10秒后执行
        Interval: 2 * time.Second, // 每2秒执行一次
    }
    scheduler.AddTask(task2)
    
    // 启动调度器
    scheduler.Start()
}

従来は、単純なGolangタスクスケジュールフレームワークの実装でしたが、実際の需要に応じて、タスクの優先度、タスクの同時実行制御などの機能を追加するなど、より複雑な拡張を行うことができます。

bannerAds