基于内存和文件存储的 queue worker, 不用 Redis 适合单进程使用没有外部依赖
因为最近要做一个简单的并发任务系统,在github 上面找了一圈并没有简单可依赖的库,所以自己写了一个。欢迎大家 Review 贡献代码。
项目地址
https://github.com/iflamed/mfworker
功能介绍
- 使用 channel 以及 goroutine 做任务分发;
- 不依赖外部系统,一般做队列或者任务的可能都会依赖redis或者其它系统;
- 可以指定worker 数量;
- 可以限制内存中缓存job的数量,内存充裕的时候可以提高分发性能;
- job 数量堆积超出内存job数量限制的时候,自动写入基于badger 的db文件;
- 可以对接外部日志系统;
- 重启继续执行上次未执行完成的 job;
- 支持queue worker 优雅结束;
Demo
package main
import (
"log"
"strconv"
"time"
"github.com/iflamed/mfworker"
)
func main() {
var (
count uint
maxItems uint
)
count = 4
maxItems = 16
path := "./test.db"
logger := nil
q := mfworker.NewQueue(count, maxItems, path, nil)
q.Handler("Test", func(job *mfworker.Job) {
time.Sleep(time.Second)
log.Printf("the job name %s, job body %s ", job.Name, job.Payload)
})
q.Start()
go func() {
for i := 0; i < 64; i++ {
job := &mfworker.Job{
Name: "Test",
Payload: []byte("body " + strconv.Itoa(i)),
}
q.Dispatch(job)
}
}()
<-time.After(10 * time.Second)
q.Stop()
}
具体使用代码可以参考 queue_test.go
最后,欢迎使用或者Review 代码,毕竟我对Golang 也不是非常熟悉。
:+1:
可否有个操作文档啥的?
@xingxiaoli 应该看测试代码就明白了。