# cronex
高性能cron库，相比目前使用得最多的cron，只是优化了性能。

# 特性
* 继承robfig/cron全部的解析器代码
* 优化调度相关性能

# cpu占用对比(越低越好)
![cronex.png](https://github.com/guonaihong/images/blob/master/cronex/cronex.png)    
测试代码位置 https://github.com/guonaihong/crontest
# 快速开始
```go
import(
    "github.com/antlabs/cronex"
)

func main() {
    cron := cronex.New()
    cron.AddFunc("* * * * * *", func() {
        //TODO
    })
    cron.Run() //开启阻塞消费者循环，如果要异步就用cron.Start()
}
```

# 关闭任务
```go
import(
    "github.com/antlabs/cronex"
)

func main() {
    cron := cronex.New()
    tm, err := cron.AddFunc("* * * * * *", func() {
        //TODO
    })
    if err != nil {
        return
    }
    tm.Stop()  //删除这个任务
    cron.Run() //开启阻塞消费者循环，如果要异步就用cron.Start()
}
```
## timer
[![Go](https://github.com/antlabs/timer/workflows/Go/badge.svg)](https://github.com/antlabs/timer/actions)
[![codecov](https://codecov.io/gh/antlabs/timer/branch/master/graph/badge.svg)](https://codecov.io/gh/antlabs/timer)

timer是高性能定时器库
## feature
* 支持一次性定时器
* 支持周期性定时器
* 支持多种数据结构后端，最小堆，5级时间轮

## 一次性定时器
```go
import (
    "github.com/antlabs/timer"
    "log"
)

func main() {
        tm := timer.NewTimer()

        tm.AfterFunc(1*time.Second, func() {
                log.Printf("after\n")
        })

        tm.AfterFunc(10*time.Second, func() {
                log.Printf("after\n")
        })
        tm.Run()
}
```
## 周期性定时器
```go
import (
    "github.com/antlabs/timer"
    "log"
)

func main() {
        tm := timer.NewTimer()

        tm.ScheduleFunc(1*time.Second, func() {
                log.Printf("schedule\n")
        })

        tm.Run()
}
```
## 自定义周期性定时器
实现时间翻倍定时的例子
```go
type curstomTest struct {
	count int
}
// 只要实现Next接口就行
func (c *curstomTest) Next(now time.Time) (rv time.Time) {
	rv = now.Add(time.Duration(c.count) * time.Millisecond * 10)
	c.count++
	return
}

func main() {
        tm := timer.NewTimer(timer.WithMinHeap())
        node := tm.CustomFunc(&curstomTest{count: 1}, func() {
                log.Printf("%v\n", time.Now())
        })
        tm.Run()
}
```
## 取消某一个定时器
```go
import (
	"log"
	"time"

	"github.com/antlabs/timer"
)

func main() {

	tm := timer.NewTimer()

	// 只会打印2 time.Second
	tm.AfterFunc(2*time.Second, func() {
		log.Printf("2 time.Second")
	})

	// tk3 会被 tk3.Stop()函数调用取消掉
	tk3 := tm.AfterFunc(3*time.Second, func() {
		log.Printf("3 time.Second")
	})

	tk3.Stop() //取消tk3

	tm.Run()
}
```
## 选择不同的的数据结构
```go
import (
    "github.com/antlabs/timer"
    "log"
)

func main() {
        tm := timer.NewTimer(timer.WithMinHeap())// 选择最小堆，默认时间轮
}
```
## benchmark

github.com/antlabs/timer 性能最高
```
goos: linux
goarch: amd64
pkg: benchmark
Benchmark_antlabs_Timer_AddTimer/N-1m-16        	 9177537	       124 ns/op
Benchmark_antlabs_Timer_AddTimer/N-5m-16        	10152950	       128 ns/op
Benchmark_antlabs_Timer_AddTimer/N-10m-16       	 9955639	       127 ns/op
Benchmark_RussellLuo_Timingwheel_AddTimer/N-1m-16         	 5316916	       222 ns/op
Benchmark_RussellLuo_Timingwheel_AddTimer/N-5m-16         	 5848843	       218 ns/op
Benchmark_RussellLuo_Timingwheel_AddTimer/N-10m-16        	 5872621	       231 ns/op
Benchmark_ouqiang_Timewheel/N-1m-16                       	  720667	      1622 ns/op
Benchmark_ouqiang_Timewheel/N-5m-16                       	  807018	      1573 ns/op
Benchmark_ouqiang_Timewheel/N-10m-16                      	  666183	      1557 ns/op
Benchmark_Stdlib_AddTimer/N-1m-16                         	 8031864	       144 ns/op
Benchmark_Stdlib_AddTimer/N-5m-16                         	 8437442	       151 ns/op
Benchmark_Stdlib_AddTimer/N-10m-16                        	 8080659	       167 ns/op

```
* 压测代码位于
https://bgithub.xyz/junelabs/timer-benchmark