Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
1 contributor

Users who have contributed to this file

141 lines (98 sloc) 3.76 KB

build status codecov godoc license

英文文档

介绍

scheduler 是 Go 语言实现的作业调度工具包。它提供了一种简单、人性化的方式去调度 Go 函数,包括延迟和周期性两种调度方式。

灵感来源于 Linux cron 和 Python schedule

功能

  • 延迟执行,精确到一秒钟
  • 周期性执行,精确到一秒钟,类似 cron 的风格,但是更加的灵活
  • 取消 job
  • 失败重试(暂时重试一次)

安装

go get github.com/prprprus/scheduler

例子

job 函数

func task1(name string, age int) {
	fmt.Printf("run task1, with arguments: %s, %d\n", name, age)
}

func task2() {
	fmt.Println("run task2, without arguments")
}

延迟调度

延迟调度支持四种模式:按秒、分、小时、天。

作为特例,任务将通过 s.Delay().Do(task) 立即执行。

package main

import (
    "fmt"

    "github.com/prprprus/scheduler"
)

func main() {
	s, err := scheduler.NewScheduler(1000)
	if err != nil {
		panic(err) // just example
	}

	// delay with 1 second, job function with arguments
	s.Delay().Second(1).Do(task1, "prprprus", 23)

	// delay with 1 minute, job function without arguments
	s.Delay().Minute(1).Do(task2)

	// delay with 1 hour
	s.Delay().Hour(1).Do(task2)

	// special: execute immediately
	s.Delay().Do(task2)

	// cancel job
	jobID := s.Delay().Day(1).Do(task2)
	err = s.CancelJob(jobID)
	if err != nil {
		panic(err)
	} else {
		fmt.Println("cancel delay job success")
	}
}

周期性调度

类似 cron 的风格,同样会包括秒、分、小时、天、星期、月,但是它们之间的顺序和数量不需要固定成一个死格式。你可以按照你的个人喜好去进行排列组合。例如,Second(3).Minute(35).Day(6)Minute(35).Day(6).Second(3) 的效果是一样的。不需要再去记格式了!🎉👏

但是为了可读性,推荐按照从小到大(或者从大到小)的顺序使用。

注意:Day()Weekday() 避免同时出现,除非你清楚知道这天是星期几。

作为特例,任务将通过 s.Every().Do(task) 每秒被执行一次。

package main

import (
    "fmt"

    "github.com/prprprus/scheduler"
)

func main() {
	s, err := scheduler.NewScheduler(1000)
	if err != nil {
		panic(err)
	}

	// Specifies time to execute periodically
	s.Every().Second(45).Minute(20).Hour(13).Day(23).Weekday(3).Month(6).Do(task1, "prprprus", 23)
	s.Every().Second(15).Minute(40).Hour(16).Weekday(4).Do(task2)
	s.Every().Second(1).Do(task1, "prprprus", 23)

	// special: executed once per second
	s.Every().Do(task2)

	// cancel job
	jobID := s.Every().Second(1).Minute(1).Hour(1).Do(task2)
	err = s.CancelJob(jobID)
	if err != nil {
		panic(err)
	} else {
		fmt.Println("cancel periodically job success")
	}
}

Documentation

完整的文档

Contribution

非常感谢你对该项目感兴趣,你的帮助对我来说是非常宝贵的。你可以提交 issue、pull requests 以及 fork,建议在 pull requests 之前先提交一个 issue 哈。

License

LICENSE 详情.

You can’t perform that action at this time.